// ***** This file is automatically generated from FunctionBinary.java.jpp
// ***** (and files it recursively includes).

package daikon.inv.ternary.threeScalar;

import daikon.*;
import daikon.inv.*;
import daikon.inv.binary.twoScalar.*;
import daikon.inv.unary.scalar.*;
import daikon.derive.unary.*;
import daikon.suppress.*;
import plume.*;
import java.lang.reflect.*;
import java.util.*;
import java.util.logging.Logger;

/**
 * Base class for each of the FunctionBinary functions and permutatons.
 * Most of the work is done here.  The subclasses basically define the
 * function and return information describing the function and permutation
 * to these methods
 */
public abstract class FunctionBinary extends ThreeScalar {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  /**
   * Boolean. True if FunctionBinary invariants should be considered.
   **/
  public static boolean dkconfig_enabled = false;

  public static Logger debug
    = Logger.getLogger("daikon.inv.ternary.threeScalar.#CLASSNAME");

  static final int[][] var_indices;
  static {
    var_indices = new int[7][];
    var_indices[1] = new int[] { 0, 1, 2 };
    var_indices[2] = new int[] { 1, 0, 2 };
    var_indices[3] = new int[] { 2, 0, 1 };
    var_indices[4] = new int[] { 0, 2, 1 };
    var_indices[5] = new int[] { 1, 2, 0 };
    var_indices[6] = new int[] { 2, 1, 0 };
  }

  protected FunctionBinary (PptSlice ppt) {
    super (ppt);
  }

  protected /*@Prototype*/ FunctionBinary () {
    super ();
  }

  /** returns whether or not this invariant is enabled **/
  public boolean enabled() {
    return dkconfig_enabled;
  }

  /** FunctionBinary is only valid on isIntegral() types **/
  public boolean instantiate_ok (VarInfo[] vis) {

    if (!valid_types (vis))
      return (false);

    // Make sure that each variable is integral (not boolean or hashcode)
    if (!vis[0].file_rep_type.isIntegral()
        || !vis[1].file_rep_type.isIntegral()
        || !vis[2].file_rep_type.isIntegral())
      return (false);

    return (true);
  }

  // check_modified relies on func having no side effects.
  abstract long func (long arg1, long arg2);
  abstract boolean is_symmetric();
  abstract String[] get_method_name();
  abstract int get_var_order();
  abstract void set_function_id (int function_id);
  abstract int get_function_id ();

  /**
   * Map from function name (eg, MultiplyLong, MinimumFloat) to an array
   * of instances (one for each valid permutation) for that function.
   */
  private static Map<String,/*@Prototype*/ FunctionBinary[]> functions = new LinkedHashMap<String,/*@Prototype*/ FunctionBinary[]>();

  /**
   * A list indexed by function number to an array of instances (one for
   * each valid permutation) for that function.  The array is the same
   * one as is stored in the functions Map.  This provides a faster access
   * mechanism once we have the function id (which are calculated the first
   * time through).
   */
  private static List</*@Prototype*/ FunctionBinary[]> func_list = new ArrayList</*@Prototype*/ FunctionBinary[]>();

  private static void build_func_list() {

    // Reflection seems to confuse clover
    ///CLOVER:OFF

    // Build the map of functions to array of instances for that function
    debug.fine ("Processing FunctionBinary");
    functions = new LinkedHashMap<String,/*@Prototype*/ FunctionBinary[]>();
    @SuppressWarnings("unchecked")
    Class</*@Prototype*/ FunctionBinary>[] subclasses = (Class</*@Prototype*/ FunctionBinary>[]) FunctionBinary.class.getDeclaredClasses();
    for (int ii = 0; ii < subclasses.length; ii++) {
      Class</*@Prototype*/ FunctionBinary> subc = subclasses[ii];
      String function = subc.getName();
      if (function.indexOf ("CLOVER") >= 0)
        continue;
      function = function.replaceFirst (".*FunctionBinary\\$", "");
      function = function.replaceFirst ("_.*", "");
      if (function.equals ("SubClass"))
        continue;
      /*@Prototype*/ FunctionBinary[] fb_arr = functions.get (function);
      if (fb_arr == null) {
        fb_arr = new /*@Prototype*/ FunctionBinary[7];
        functions.put (function, fb_arr);
        func_list.add (fb_arr);
      }
      int func_id = func_list.indexOf (fb_arr);
      @SuppressWarnings({"nonprototype"})
      /*@Prototype*/ FunctionBinary fb = null;
      try {
        Constructor</*@Prototype*/ FunctionBinary> con = subc.getDeclaredConstructor (new Class<?>[] {});
        fb = con.newInstance (new Object[] {});
      }  catch (Exception e) {
        throw new Error (" can't create instance for " + subc.getName()
                        + ": '" + e + "' ii = " + ii);
      }
      assert fb_arr[fb.get_var_order()] == null;
      fb_arr[fb.get_var_order()] = fb;
      fb.set_function_id (func_id);
      debug.fine ("Adding " + function + " " + fb.getClass().getName()
                  + " " + fb.get_var_order() + " " + fb.get_function_id());
    }
    ///CLOVER:ON
  }

  /**
   * Returns a list of all of the FunctionBinary prototype invariants
   */
  public static List</*@Prototype*/ Invariant> get_proto_all() {

    List</*@Prototype*/ Invariant> result = new ArrayList</*@Prototype*/ Invariant>();

    // If this is the first call
    if (functions.isEmpty()) {
      build_func_list();
    }

    // Get the proto invariant for all of the subclasses and return them
    for (/*@Prototype*/ FunctionBinary[] fb_arr : func_list) {
      for (int jj = 1; jj < fb_arr.length; jj++) {
        /*@Prototype*/ FunctionBinary fb = fb_arr[jj];
        if (fb != null) {
          result.add (fb);
        }
      }
    }
    return (result);
  }

  /** Permuted result var. */
  public VarInfo resultVar() {
    return ppt.var_infos[var_indices[get_var_order()][0]];
  }

  /** Permuted arg1 var. */
  public VarInfo argVar1() {
    return ppt.var_infos[var_indices[get_var_order()][1]];
  }

  /** Permuted arg2 var. */
  public VarInfo argVar2() {
    return ppt.var_infos[var_indices[get_var_order()][2]];
  }

  /**
   * Apply the specified sample to the function, returning the result
   * The caller is responsible for permuting the arguments.
   */
  public InvariantStatus check_ordered (long result, long arg1,
                                      long arg2, int count) {
    // This implementation relies on func having no side effects.
    try {
      if (!((result) == ( func (arg1, arg2))))
        return InvariantStatus.FALSIFIED;
    } catch (Exception e) {
        return InvariantStatus.FALSIFIED;
    }
    return InvariantStatus.NO_CHANGE;
  }

  /**
   * Apply the specified sample to the function, returning the result
   * The caller is responsible for permuting the arguments.
   */
  public InvariantStatus add_ordered (long result, long arg1,
                                      long arg2, int count) {
    return check_ordered(result, arg1, arg2, count);
  }

  /**
   * Reorganize our already-seen state as if the variables had shifted
   * order underneath us (re-arrangement given by the permutation).
   * We accomplish this by returning the class that corresponds to the
   * the new permutation.
   */
  protected Invariant resurrect_done (int[] permutation) {

    assert permutation.length == 3;
    assert ArraysMDE.fn_is_permutation(permutation);

    int[] new_order = new int[3];
    int[] old_order = var_indices[get_var_order()];

    // "permutation" is a permutation on the var_info array. old_order
    // was the permutation that took the formatted invariant to the
    // var_info array, so old_order^-1 is the permutation from the
    // var_info array to the old formatted invariant. We want to find
    // a new_order so that when we first do "permutation", then
    // apply the new permutation from the var_info array to the
    // formatted invariant, we get the same formatted invariant.
    // What we want, then. is:
    //    new_order^-1 o permutation = old_order^-1
    // rearranging, this is equivalent to
    //    new_order = permutation o old_order
    new_order[0] = permutation[old_order[0]];
    new_order[1] = permutation[old_order[1]];
    new_order[2] = permutation[old_order[2]];

    // Force symmetric functions into a canonical form so that
    // we can match them when necessary and they always print the same.
    // For example, order of 0, 1, 2 and 0, 2, 1 represent the same
    // invariant for a symmetric function.  This forces them to always
    // be represented as 0, 1, 2
    if (is_symmetric ()) {
      if (new_order[2] < new_order[1]) {
        int tmp = new_order[2];
        new_order[2] = new_order[1];
        new_order[1] = tmp;
      }
    }

    // Look for the new order in the list of possible orders
    int var_order = -1;
    for (int i=0; i < var_indices.length; i++) {
      if (Arrays.equals(new_order, var_indices[i])) {
        var_order = i;
        break;
      }
    }
    assert var_order != -1;

    // If the var order hasn't changed, we don't need to do anything
    if (var_order == get_var_order())
      return (this);

    // Find the class that corresponds to the new order
    if (functions.isEmpty())
      build_func_list();
    int func_id = get_function_id();
    /*@Prototype*/ FunctionBinary[] fb_arr = func_list.get (func_id);
    assert fb_arr != null;
    for (int ii = 0; ii < fb_arr.length; ii++)
      if ((fb_arr[ii] != null) && (fb_arr[ii].get_var_order() == var_order))
        return (fb_arr[ii].instantiate_dyn (ppt));

    throw new Error ("Could not find new ordering");
  }

  public String repr() {
    return format();
  }

  public String format_using(OutputFormat format) {
    if (format == OutputFormat.SIMPLIFY) {
      return format_simplify();
    }

    int var_order = get_var_order();
    String[] methodname = get_method_name();

    VarInfo argresultvi = ppt.var_infos[var_indices[var_order][0]];
    VarInfo arg1vi = ppt.var_infos[var_indices[var_order][1]];
    VarInfo arg2vi = ppt.var_infos[var_indices[var_order][2]];

    String argresult_name = argresultvi.name_using(format);
    String arg1_name = arg1vi.name_using(format);
    String arg2_name = arg2vi.name_using(format);

    if (format == OutputFormat.DAIKON) {
      return argresult_name + " == (" + methodname[0] + arg1_name
        + methodname[1] + arg2_name + methodname[2] + ")";
    }

    if (format.isJavaFamily()) {
      if (methodname[1].equals(" || ") || methodname[1].equals(" && ")) {
        return "(" +  argresult_name + " != 0) == ((" + methodname[0] + arg1_name + " != 0)"
          + methodname[1] + "(" + arg2_name + methodname[2] + " != 0))";
      } else {
        return argresult_name + " == (" + methodname[0] + arg1_name
          + methodname[1] + arg2_name + methodname[2] + ")";
      }
    }

    return format_unimplemented(format);
  }

  public String format_simplify() {
    int var_order = get_var_order();
    String[] methodname = get_method_name();
    VarInfo[] vis = ppt.var_infos;

    String result = vis[var_indices[var_order][0]].simplifyFixedupName();
    String arg1 =   vis[var_indices[var_order][1]].simplifyFixedupName();
    String arg2 =   vis[var_indices[var_order][2]].simplifyFixedupName();
    String func = null;
    if (methodname[1].equals(" * ")) {
      func = "*";
    } else if (methodname[1].equals(" | ")) {
      func = "|java-bitwise-or|";
    } else if (methodname[1].equals(" || ")) {
      func = "|java-logical-or|";
    } else if (methodname[1].equals(", ")) {
      if (methodname[0].equals("java.lang.Math.min("))
        func = "min";
      else if (methodname[0].equals("java.lang.Math.max("))
        func = "max";
      else if (methodname[0].equals("plume.MathMDE.gcd("))
        func = "gcd";
      else if (methodname[0].equals("java.lang.Math.pow("))
        func = "pow";
      else if (methodname[0].equals("plume.MathMDE.logicalXor("))
        func = "|java-logical-xor|";
    } else {
      assert methodname[0].equals("");
      assert methodname[2].equals("");
      func = "|java-" + methodname[1].trim() + "|";
    }
    if (func == null)
      return "format_simplify() doesn't know function " + methodname[0] + "-" +
        methodname[1] + "-" + methodname[2];
    return "(EQ " + result + " (" + func + " " + arg1 + " " + arg2 + "))";
  }

  // If our classes match, we must match
  public boolean isSameFormula(Invariant other) {
    return true;
  }
  public double computeConfidence() {
    if (logOn()) {
      VarInfo v1 = ppt.var_infos[0];
      VarInfo v2 = ppt.var_infos[1];
      VarInfo v3 = ppt.var_infos[2];
      log("computeConfidence(" + format()
         + ": num_values = " + ppt.num_values()
         + ", num_values(" + v1.name() + ")=" + ppt.parent.num_values(v1)
         + ", num_values(" + v2.name() + ")=" + ppt.parent.num_values(v2)
         + ", num_values(" + v3.name() + ")=" + ppt.parent.num_values(v3));
    }
    return Invariant.conf_is_ge(ppt.num_values(), 5);
  }

  /**
   * If the arg is a sequence size, return the sequence; otherwise return null.
   **/
  private /*@Nullable*/ VarInfo sized_sequence(VarInfo size) {
    if (size.derived instanceof SequenceLength) {
      return ((SequenceLength)size.derived).base;
    }
    return null;
  }

  public /*@Nullable*/ DiscardInfo isObviousDynamically(VarInfo[] vis) {

    DiscardInfo super_result = super.isObviousDynamically(vis);
    if (super_result != null) {
      return super_result;
    }

    // Discard if any two of the three variables are the sizes of the
    // same arrays.
    VarInfo arr1 = sized_sequence(vis[0]);
    VarInfo arr2 = sized_sequence(vis[1]);
    VarInfo arr3 = sized_sequence(vis[2]);
    if (((arr1 != null) && (arr1 == arr2))
        || ((arr1 != null) && (arr1 == arr3))
        || ((arr2 != null) && (arr2 == arr3))) {
      return new DiscardInfo(this, DiscardCode.obvious,
                    "two are sizes of same array:  "
                    + vis[0].name() + " "
                    + vis[1].name() + " "
                    + vis[2].name());
    }

    return null;
  }

  // default is that it is not this function, overriden in the subclass
  public boolean isMultiply () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = Multiply (y, z)</samp>
 * over three long scalars.
 */
public static class MultiplyLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ MultiplyLong_xyz proto;

  /** Returns the prototype invariant for MultiplyLong_xyz **/
  public static /*@Prototype*/ MultiplyLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ MultiplyLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected MultiplyLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new MultiplyLong_xyz (slice);
  }

  private MultiplyLong_xyz (PptSlice slice) {
    super (slice);
  }

  public MultiplyLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " * ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert MultiplyLong_xyz.function_id == -1;
    MultiplyLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

    return (y * z);
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isMultiply() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (MultiplyLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (y == 0) ==> r = y * z
        new NISuppression (result_eq_0, arg1_eq_0, suppressee),

        // (r == 0) && (z == 0) ==> r = y * z
        new NISuppression (result_eq_0, arg2_eq_0, suppressee),

        // (r == y) && (z == 1) ==> r = y * z
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),

        // (r == z) && (y == 1) ==> r = y * z
        new NISuppression (result_eq_arg2, arg1_eq_1, suppressee),

        // (r == y) && (z boolean) && (z==0 ==> y==0)
        // x = x * 0 is true if x == 0
        // x = x * 1 is true for all x
        new NISuppression (arg2_boolean, arg2_track0_arg1, result_eq_arg1,
                           suppressee),

        // (r == z) && (y boolean) && (y==0 ==> z=0)
        new NISuppression (result_eq_arg2, arg1_track0_arg2, arg1_boolean,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Multiply (x, z)</samp>
 * over three long scalars.
 */
public static class MultiplyLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ MultiplyLong_yxz proto;

  /** Returns the prototype invariant for MultiplyLong_yxz **/
  public static /*@Prototype*/ MultiplyLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ MultiplyLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected MultiplyLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new MultiplyLong_yxz (slice);
  }

  private MultiplyLong_yxz (PptSlice slice) {
    super (slice);
  }

  public MultiplyLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " * ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert MultiplyLong_yxz.function_id == -1;
    MultiplyLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

    return (x * z);
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isMultiply() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (MultiplyLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (x == 0) ==> r = x * z
        new NISuppression (result_eq_0, arg1_eq_0, suppressee),

        // (r == 0) && (z == 0) ==> r = x * z
        new NISuppression (result_eq_0, arg2_eq_0, suppressee),

        // (r == x) && (z == 1) ==> r = x * z
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),

        // (r == z) && (x == 1) ==> r = x * z
        new NISuppression (result_eq_arg2, arg1_eq_1, suppressee),

        // (r == x) && (z boolean) && (z==0 ==> x==0)
        // x = x * 0 is true if x == 0
        // x = x * 1 is true for all x
        new NISuppression (arg2_boolean, arg2_track0_arg1, result_eq_arg1,
                           suppressee),

        // (r == z) && (x boolean) && (x==0 ==> z=0)
        new NISuppression (result_eq_arg2, arg1_track0_arg2, arg1_boolean,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Multiply (x, y)</samp>
 * over three long scalars.
 */
public static class MultiplyLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ MultiplyLong_zxy proto;

  /** Returns the prototype invariant for MultiplyLong_zxy **/
  public static /*@Prototype*/ MultiplyLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ MultiplyLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected MultiplyLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new MultiplyLong_zxy (slice);
  }

  private MultiplyLong_zxy (PptSlice slice) {
    super (slice);
  }

  public MultiplyLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " * ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert MultiplyLong_zxy.function_id == -1;
    MultiplyLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

    return (x * y);
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isMultiply() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (MultiplyLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (x == 0) ==> r = x * y
        new NISuppression (result_eq_0, arg1_eq_0, suppressee),

        // (r == 0) && (y == 0) ==> r = x * y
        new NISuppression (result_eq_0, arg2_eq_0, suppressee),

        // (r == x) && (y == 1) ==> r = x * y
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),

        // (r == y) && (x == 1) ==> r = x * y
        new NISuppression (result_eq_arg2, arg1_eq_1, suppressee),

        // (r == x) && (y boolean) && (y==0 ==> x==0)
        // x = x * 0 is true if x == 0
        // x = x * 1 is true for all x
        new NISuppression (arg2_boolean, arg2_track0_arg1, result_eq_arg1,
                           suppressee),

        // (r == y) && (x boolean) && (x==0 ==> y=0)
        new NISuppression (result_eq_arg2, arg1_track0_arg2, arg1_boolean,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // "define" EQUALITY_MIN_MAX_SUPPRESS

  // default is that it is not this function, overriden in the subclass
  public boolean isMinimum () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = Minimum (y, z)</samp>
 * over three long scalars.
 */
public static class MinimumLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ MinimumLong_xyz proto;

  /** Returns the prototype invariant for MinimumLong_xyz **/
  public static /*@Prototype*/ MinimumLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ MinimumLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected MinimumLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new MinimumLong_xyz (slice);
  }

  private MinimumLong_xyz (PptSlice slice) {
    super (slice);
  }

  public MinimumLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.min(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert MinimumLong_xyz.function_id == -1;
    MinimumLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

    return (Math.min (y, z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isMinimum() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (MinimumLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (x == y) && (y <= z) ==> r = min(y, z)
        new NISuppression (result_eq_arg1, arg1_le_arg2, suppressee),

        // (x == z) && (z <= y) ==> r = min(y, z)
        new NISuppression (result_eq_arg2, arg2_le_arg1, suppressee),

        // (x boolean) && (y=0 <==> r=0) && (z == 1)
        // 0 = min (y, 1), true when (y == 0)
        // 1 = min (y, 1), true when (y > 0)
        new NISuppression (result_track0_arg1, arg1_track0_result,
                           result_boolean, arg1_ge_0, arg2_eq_1, suppressee),

        // (x boolean) && (z=0 <==> r=0) && (y == 1)
        new NISuppression (result_track0_arg2, arg2_track0_result,
                           result_boolean, arg2_ge_0, arg1_eq_1, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Minimum (x, z)</samp>
 * over three long scalars.
 */
public static class MinimumLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ MinimumLong_yxz proto;

  /** Returns the prototype invariant for MinimumLong_yxz **/
  public static /*@Prototype*/ MinimumLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ MinimumLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected MinimumLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new MinimumLong_yxz (slice);
  }

  private MinimumLong_yxz (PptSlice slice) {
    super (slice);
  }

  public MinimumLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.min(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert MinimumLong_yxz.function_id == -1;
    MinimumLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

    return (Math.min (x, z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isMinimum() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (MinimumLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (y == x) && (x <= z) ==> r = min(x, z)
        new NISuppression (result_eq_arg1, arg1_le_arg2, suppressee),

        // (y == z) && (z <= x) ==> r = min(x, z)
        new NISuppression (result_eq_arg2, arg2_le_arg1, suppressee),

        // (y boolean) && (x=0 <==> r=0) && (z == 1)
        // 0 = min (x, 1), true when (x == 0)
        // 1 = min (x, 1), true when (x > 0)
        new NISuppression (result_track0_arg1, arg1_track0_result,
                           result_boolean, arg1_ge_0, arg2_eq_1, suppressee),

        // (y boolean) && (z=0 <==> r=0) && (x == 1)
        new NISuppression (result_track0_arg2, arg2_track0_result,
                           result_boolean, arg2_ge_0, arg1_eq_1, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Minimum (x, y)</samp>
 * over three long scalars.
 */
public static class MinimumLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ MinimumLong_zxy proto;

  /** Returns the prototype invariant for MinimumLong_zxy **/
  public static /*@Prototype*/ MinimumLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ MinimumLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected MinimumLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new MinimumLong_zxy (slice);
  }

  private MinimumLong_zxy (PptSlice slice) {
    super (slice);
  }

  public MinimumLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.min(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert MinimumLong_zxy.function_id == -1;
    MinimumLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

    return (Math.min (x, y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isMinimum() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (MinimumLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (z == x) && (x <= y) ==> r = min(x, y)
        new NISuppression (result_eq_arg1, arg1_le_arg2, suppressee),

        // (z == y) && (y <= x) ==> r = min(x, y)
        new NISuppression (result_eq_arg2, arg2_le_arg1, suppressee),

        // (z boolean) && (x=0 <==> r=0) && (y == 1)
        // 0 = min (x, 1), true when (x == 0)
        // 1 = min (x, 1), true when (x > 0)
        new NISuppression (result_track0_arg1, arg1_track0_result,
                           result_boolean, arg1_ge_0, arg2_eq_1, suppressee),

        // (z boolean) && (y=0 <==> r=0) && (x == 1)
        new NISuppression (result_track0_arg2, arg2_track0_result,
                           result_boolean, arg2_ge_0, arg1_eq_1, suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // "define" EQUALITY_MIN_MAX_SUPPRESS

  // default is that it is not this function, overriden in the subclass
  public boolean isMaximum () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = Maximum (y, z)</samp>
 * over three long scalars.
 */
public static class MaximumLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ MaximumLong_xyz proto;

  /** Returns the prototype invariant for MaximumLong_xyz **/
  public static /*@Prototype*/ MaximumLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ MaximumLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected MaximumLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new MaximumLong_xyz (slice);
  }

  private MaximumLong_xyz (PptSlice slice) {
    super (slice);
  }

  public MaximumLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.max(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert MaximumLong_xyz.function_id == -1;
    MaximumLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

    return (Math.max (y, z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isMaximum() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (MaximumLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (z <= y) ==> r = max(y, z)
        new NISuppression (result_eq_arg1, arg2_le_arg1, suppressee),

        // (r == z) && (y <= z) ==> r = max(y, z)
        new NISuppression (result_eq_arg2, arg1_le_arg2, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Maximum (x, z)</samp>
 * over three long scalars.
 */
public static class MaximumLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ MaximumLong_yxz proto;

  /** Returns the prototype invariant for MaximumLong_yxz **/
  public static /*@Prototype*/ MaximumLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ MaximumLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected MaximumLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new MaximumLong_yxz (slice);
  }

  private MaximumLong_yxz (PptSlice slice) {
    super (slice);
  }

  public MaximumLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.max(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert MaximumLong_yxz.function_id == -1;
    MaximumLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

    return (Math.max (x, z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isMaximum() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (MaximumLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (z <= x) ==> r = max(x, z)
        new NISuppression (result_eq_arg1, arg2_le_arg1, suppressee),

        // (r == z) && (x <= z) ==> r = max(x, z)
        new NISuppression (result_eq_arg2, arg1_le_arg2, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Maximum (x, y)</samp>
 * over three long scalars.
 */
public static class MaximumLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ MaximumLong_zxy proto;

  /** Returns the prototype invariant for MaximumLong_zxy **/
  public static /*@Prototype*/ MaximumLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ MaximumLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected MaximumLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new MaximumLong_zxy (slice);
  }

  private MaximumLong_zxy (PptSlice slice) {
    super (slice);
  }

  public MaximumLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.max(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert MaximumLong_zxy.function_id == -1;
    MaximumLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

    return (Math.max (x, y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isMaximum() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (MaximumLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (y <= x) ==> r = max(x, y)
        new NISuppression (result_eq_arg1, arg2_le_arg1, suppressee),

        // (r == y) && (x <= y) ==> r = max(x, y)
        new NISuppression (result_eq_arg2, arg1_le_arg2, suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // default is that it is not this function, overriden in the subclass
  public boolean isDivision () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = Division (y, z)</samp>
 * over three long scalars.
 */
public static class DivisionLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ DivisionLong_xyz proto;

  /** Returns the prototype invariant for DivisionLong_xyz **/
  public static /*@Prototype*/ DivisionLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ DivisionLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected DivisionLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new DivisionLong_xyz (slice);
  }

  private DivisionLong_xyz (PptSlice slice) {
    super (slice);
  }

  public DivisionLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " / ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert DivisionLong_xyz.function_id == -1;
    DivisionLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long z) {

    return ((y / z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isDivision() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (DivisionLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (y < z) && (y >= 0) && (z != 0) ==> r = y / z
        new NISuppression (result_eq_0, arg1_lt_arg2, arg1_ge_0, arg2_ne_0, suppressee),

        // (y == z) && (z != 0) && (r == 1)
        new NISuppression (arg1_eq_arg2, arg2_ne_0, result_eq_1, suppressee),

        // (r == y) && (z == 1) ==> r = y / z
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Division (x, z)</samp>
 * over three long scalars.
 */
public static class DivisionLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ DivisionLong_yxz proto;

  /** Returns the prototype invariant for DivisionLong_yxz **/
  public static /*@Prototype*/ DivisionLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ DivisionLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected DivisionLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new DivisionLong_yxz (slice);
  }

  private DivisionLong_yxz (PptSlice slice) {
    super (slice);
  }

  public DivisionLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " / ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert DivisionLong_yxz.function_id == -1;
    DivisionLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long z) {

    return ((x / z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isDivision() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (DivisionLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (x < z) && (x >= 0) && (z != 0) ==> r = x / z
        new NISuppression (result_eq_0, arg1_lt_arg2, arg1_ge_0, arg2_ne_0, suppressee),

        // (x == z) && (z != 0) && (r == 1)
        new NISuppression (arg1_eq_arg2, arg2_ne_0, result_eq_1, suppressee),

        // (r == x) && (z == 1) ==> r = x / z
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Division (x, y)</samp>
 * over three long scalars.
 */
public static class DivisionLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ DivisionLong_zxy proto;

  /** Returns the prototype invariant for DivisionLong_zxy **/
  public static /*@Prototype*/ DivisionLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ DivisionLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected DivisionLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new DivisionLong_zxy (slice);
  }

  private DivisionLong_zxy (PptSlice slice) {
    super (slice);
  }

  public DivisionLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " / ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert DivisionLong_zxy.function_id == -1;
    DivisionLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long y) {

    return ((x / y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isDivision() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (DivisionLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (x < y) && (x >= 0) && (y != 0) ==> r = x / y
        new NISuppression (result_eq_0, arg1_lt_arg2, arg1_ge_0, arg2_ne_0, suppressee),

        // (x == y) && (y != 0) && (r == 1)
        new NISuppression (arg1_eq_arg2, arg2_ne_0, result_eq_1, suppressee),

        // (r == x) && (y == 1) ==> r = x / y
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>x = Division (z, y)</samp>
 * over three long scalars.
 */
public static class DivisionLong_xzy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ DivisionLong_xzy proto;

  /** Returns the prototype invariant for DivisionLong_xzy **/
  public static /*@Prototype*/ DivisionLong_xzy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ DivisionLong_xzy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected DivisionLong_xzy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new DivisionLong_xzy (slice);
  }

  private DivisionLong_xzy (PptSlice slice) {
    super (slice);
  }

  public DivisionLong_xzy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " / ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert DivisionLong_xzy.function_id == -1;
    DivisionLong_xzy.function_id = function_id;
  }

  private static int var_order = 4;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long y) {

    return ((z / y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, z, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, z, y));
    return (add_ordered (x, z, y, count));
  }

  public boolean isDivision() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (DivisionLong_xzy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (z < y) && (z >= 0) && (y != 0) ==> r = z / y
        new NISuppression (result_eq_0, arg1_lt_arg2, arg1_ge_0, arg2_ne_0, suppressee),

        // (z == y) && (y != 0) && (r == 1)
        new NISuppression (arg1_eq_arg2, arg2_ne_0, result_eq_1, suppressee),

        // (r == z) && (y == 1) ==> r = z / y
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Division (z, x)</samp>
 * over three long scalars.
 */
public static class DivisionLong_yzx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ DivisionLong_yzx proto;

  /** Returns the prototype invariant for DivisionLong_yzx **/
  public static /*@Prototype*/ DivisionLong_yzx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ DivisionLong_yzx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected DivisionLong_yzx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new DivisionLong_yzx (slice);
  }

  private DivisionLong_yzx (PptSlice slice) {
    super (slice);
  }

  public DivisionLong_yzx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " / ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert DivisionLong_yzx.function_id == -1;
    DivisionLong_yzx.function_id = function_id;
  }

  private static int var_order = 5;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long x) {

    return ((z / x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, z, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, z, x));
    return (add_ordered (y, z, x, count));
  }

  public boolean isDivision() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (DivisionLong_yzx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (z < x) && (z >= 0) && (x != 0) ==> r = z / x
        new NISuppression (result_eq_0, arg1_lt_arg2, arg1_ge_0, arg2_ne_0, suppressee),

        // (z == x) && (x != 0) && (r == 1)
        new NISuppression (arg1_eq_arg2, arg2_ne_0, result_eq_1, suppressee),

        // (r == z) && (x == 1) ==> r = z / x
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Division (y, x)</samp>
 * over three long scalars.
 */
public static class DivisionLong_zyx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ DivisionLong_zyx proto;

  /** Returns the prototype invariant for DivisionLong_zyx **/
  public static /*@Prototype*/ DivisionLong_zyx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ DivisionLong_zyx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected DivisionLong_zyx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new DivisionLong_zyx (slice);
  }

  private DivisionLong_zyx (PptSlice slice) {
    super (slice);
  }

  public DivisionLong_zyx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " / ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert DivisionLong_zyx.function_id == -1;
    DivisionLong_zyx.function_id = function_id;
  }

  private static int var_order = 6;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long x) {

    return ((y / x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, y, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, y, x));
    return (add_ordered (z, y, x, count));
  }

  public boolean isDivision() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (DivisionLong_zyx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (y < x) && (y >= 0) && (x != 0) ==> r = y / x
        new NISuppression (result_eq_0, arg1_lt_arg2, arg1_ge_0, arg2_ne_0, suppressee),

        // (y == x) && (x != 0) && (r == 1)
        new NISuppression (arg1_eq_arg2, arg2_ne_0, result_eq_1, suppressee),

        // (r == y) && (x == 1) ==> r = y / x
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),
      });

  // Create a suppression factory for functionBinary

}

  // default is that it is not this function, overriden in the subclass
  public boolean isPower () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = Power (y, z)</samp>
 * over three long scalars.
 */
public static class PowerLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ PowerLong_xyz proto;

  /** Returns the prototype invariant for PowerLong_xyz **/
  public static /*@Prototype*/ PowerLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ PowerLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected PowerLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new PowerLong_xyz (slice);
  }

  private PowerLong_xyz (PptSlice slice) {
    super (slice);
  }

  public PowerLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.pow(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert PowerLong_xyz.function_id == -1;
    PowerLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long z) {

    return (MathMDE.pow (y, z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isPower() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (PowerLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    // Note that any suppression that doesn't limit z to valid exponents
    // (>= 0), must check for valid exponents as well (so that the invariant
    // is correctly destroyed on invalid exponents)
    //
    // Note also that pow(0,0) == 1 and pow(0,x), where (x > 0), == 0
    // Another interesting artificat of pow is that for any even base, any
    // exponent >= 64 will yield a result of 0.  For example, pow(10,256) == 0
    // (at least for integers)

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 1) && (z == 0) ==> r = pow (y, z)
        new NISuppression (result_eq_1, arg2_eq_0, suppressee),

        // (r == 1) && (y == 1) && (z >= 0)   ==> r = pow (y, z)
        new NISuppression (result_eq_1, arg1_eq_1, arg2_ge_0, suppressee),

        // (r == 0) && (y == 0) && (z > 0)
        new NISuppression (result_eq_0, arg1_eq_0, arg2_ne_0, arg2_ge_0,
                          suppressee),

        // (r == y) && (z == 1)    ==> r = pow (y, z)
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),

        // (r == 0) && (y even) && (z >= 64)
        // with each multiply there is one more zero in the result and since
        // a long has 64 bits in it, it becomes zero at that point
        new NISuppression (result_eq_0, arg1_even, arg2_ge_64, suppressee),

        // (r == 1) && (y boolean) && (y==0 <==> z==0) && (z >= 0)
        // 1 = pow (0, z) true iff (z == 0)
        // 1 = pow (1, z) true when z valid exponent
        new NISuppression (arg1_track0_arg2, arg2_ge_0, arg1_boolean,
                           result_eq_1, suppressee),

        // (r == y) && (r boolean) && (z > 0)
        // 0 = pow (0, z) true when z != 0
        // 1 = pow (1, z) true when z valid exponent
        new NISuppression (result_eq_arg1, result_boolean, arg2_ne_0,
                           arg2_ge_0, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Power (x, z)</samp>
 * over three long scalars.
 */
public static class PowerLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ PowerLong_yxz proto;

  /** Returns the prototype invariant for PowerLong_yxz **/
  public static /*@Prototype*/ PowerLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ PowerLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected PowerLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new PowerLong_yxz (slice);
  }

  private PowerLong_yxz (PptSlice slice) {
    super (slice);
  }

  public PowerLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.pow(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert PowerLong_yxz.function_id == -1;
    PowerLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long z) {

    return (MathMDE.pow (x, z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isPower() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (PowerLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    // Note that any suppression that doesn't limit z to valid exponents
    // (>= 0), must check for valid exponents as well (so that the invariant
    // is correctly destroyed on invalid exponents)
    //
    // Note also that pow(0,0) == 1 and pow(0,x), where (x > 0), == 0
    // Another interesting artificat of pow is that for any even base, any
    // exponent >= 64 will yield a result of 0.  For example, pow(10,256) == 0
    // (at least for integers)

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 1) && (z == 0) ==> r = pow (x, z)
        new NISuppression (result_eq_1, arg2_eq_0, suppressee),

        // (r == 1) && (x == 1) && (z >= 0)   ==> r = pow (x, z)
        new NISuppression (result_eq_1, arg1_eq_1, arg2_ge_0, suppressee),

        // (r == 0) && (x == 0) && (z > 0)
        new NISuppression (result_eq_0, arg1_eq_0, arg2_ne_0, arg2_ge_0,
                          suppressee),

        // (r == x) && (z == 1)    ==> r = pow (x, z)
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),

        // (r == 0) && (x even) && (z >= 64)
        // with each multiply there is one more zero in the result and since
        // a long has 64 bits in it, it becomes zero at that point
        new NISuppression (result_eq_0, arg1_even, arg2_ge_64, suppressee),

        // (r == 1) && (x boolean) && (x==0 <==> z==0) && (z >= 0)
        // 1 = pow (0, z) true iff (z == 0)
        // 1 = pow (1, z) true when z valid exponent
        new NISuppression (arg1_track0_arg2, arg2_ge_0, arg1_boolean,
                           result_eq_1, suppressee),

        // (r == x) && (r boolean) && (z > 0)
        // 0 = pow (0, z) true when z != 0
        // 1 = pow (1, z) true when z valid exponent
        new NISuppression (result_eq_arg1, result_boolean, arg2_ne_0,
                           arg2_ge_0, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Power (x, y)</samp>
 * over three long scalars.
 */
public static class PowerLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ PowerLong_zxy proto;

  /** Returns the prototype invariant for PowerLong_zxy **/
  public static /*@Prototype*/ PowerLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ PowerLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected PowerLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new PowerLong_zxy (slice);
  }

  private PowerLong_zxy (PptSlice slice) {
    super (slice);
  }

  public PowerLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.pow(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert PowerLong_zxy.function_id == -1;
    PowerLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long y) {

    return (MathMDE.pow (x, y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isPower() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (PowerLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    // Note that any suppression that doesn't limit y to valid exponents
    // (>= 0), must check for valid exponents as well (so that the invariant
    // is correctly destroyed on invalid exponents)
    //
    // Note also that pow(0,0) == 1 and pow(0,x), where (x > 0), == 0
    // Another interesting artificat of pow is that for any even base, any
    // exponent >= 64 will yield a result of 0.  For example, pow(10,256) == 0
    // (at least for integers)

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 1) && (y == 0) ==> r = pow (x, y)
        new NISuppression (result_eq_1, arg2_eq_0, suppressee),

        // (r == 1) && (x == 1) && (y >= 0)   ==> r = pow (x, y)
        new NISuppression (result_eq_1, arg1_eq_1, arg2_ge_0, suppressee),

        // (r == 0) && (x == 0) && (y > 0)
        new NISuppression (result_eq_0, arg1_eq_0, arg2_ne_0, arg2_ge_0,
                          suppressee),

        // (r == x) && (y == 1)    ==> r = pow (x, y)
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),

        // (r == 0) && (x even) && (y >= 64)
        // with each multiply there is one more zero in the result and since
        // a long has 64 bits in it, it becomes zero at that point
        new NISuppression (result_eq_0, arg1_even, arg2_ge_64, suppressee),

        // (r == 1) && (x boolean) && (x==0 <==> y==0) && (y >= 0)
        // 1 = pow (0, y) true iff (y == 0)
        // 1 = pow (1, y) true when y valid exponent
        new NISuppression (arg1_track0_arg2, arg2_ge_0, arg1_boolean,
                           result_eq_1, suppressee),

        // (r == x) && (r boolean) && (y > 0)
        // 0 = pow (0, y) true when y != 0
        // 1 = pow (1, y) true when y valid exponent
        new NISuppression (result_eq_arg1, result_boolean, arg2_ne_0,
                           arg2_ge_0, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>x = Power (z, y)</samp>
 * over three long scalars.
 */
public static class PowerLong_xzy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ PowerLong_xzy proto;

  /** Returns the prototype invariant for PowerLong_xzy **/
  public static /*@Prototype*/ PowerLong_xzy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ PowerLong_xzy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected PowerLong_xzy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new PowerLong_xzy (slice);
  }

  private PowerLong_xzy (PptSlice slice) {
    super (slice);
  }

  public PowerLong_xzy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.pow(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert PowerLong_xzy.function_id == -1;
    PowerLong_xzy.function_id = function_id;
  }

  private static int var_order = 4;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long y) {

    return (MathMDE.pow (z, y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, z, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, z, y));
    return (add_ordered (x, z, y, count));
  }

  public boolean isPower() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (PowerLong_xzy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    // Note that any suppression that doesn't limit y to valid exponents
    // (>= 0), must check for valid exponents as well (so that the invariant
    // is correctly destroyed on invalid exponents)
    //
    // Note also that pow(0,0) == 1 and pow(0,x), where (x > 0), == 0
    // Another interesting artificat of pow is that for any even base, any
    // exponent >= 64 will yield a result of 0.  For example, pow(10,256) == 0
    // (at least for integers)

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 1) && (y == 0) ==> r = pow (z, y)
        new NISuppression (result_eq_1, arg2_eq_0, suppressee),

        // (r == 1) && (z == 1) && (y >= 0)   ==> r = pow (z, y)
        new NISuppression (result_eq_1, arg1_eq_1, arg2_ge_0, suppressee),

        // (r == 0) && (z == 0) && (y > 0)
        new NISuppression (result_eq_0, arg1_eq_0, arg2_ne_0, arg2_ge_0,
                          suppressee),

        // (r == z) && (y == 1)    ==> r = pow (z, y)
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),

        // (r == 0) && (z even) && (y >= 64)
        // with each multiply there is one more zero in the result and since
        // a long has 64 bits in it, it becomes zero at that point
        new NISuppression (result_eq_0, arg1_even, arg2_ge_64, suppressee),

        // (r == 1) && (z boolean) && (z==0 <==> y==0) && (y >= 0)
        // 1 = pow (0, y) true iff (y == 0)
        // 1 = pow (1, y) true when y valid exponent
        new NISuppression (arg1_track0_arg2, arg2_ge_0, arg1_boolean,
                           result_eq_1, suppressee),

        // (r == z) && (r boolean) && (y > 0)
        // 0 = pow (0, y) true when y != 0
        // 1 = pow (1, y) true when y valid exponent
        new NISuppression (result_eq_arg1, result_boolean, arg2_ne_0,
                           arg2_ge_0, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Power (z, x)</samp>
 * over three long scalars.
 */
public static class PowerLong_yzx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ PowerLong_yzx proto;

  /** Returns the prototype invariant for PowerLong_yzx **/
  public static /*@Prototype*/ PowerLong_yzx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ PowerLong_yzx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected PowerLong_yzx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new PowerLong_yzx (slice);
  }

  private PowerLong_yzx (PptSlice slice) {
    super (slice);
  }

  public PowerLong_yzx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.pow(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert PowerLong_yzx.function_id == -1;
    PowerLong_yzx.function_id = function_id;
  }

  private static int var_order = 5;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long x) {

    return (MathMDE.pow (z, x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, z, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, z, x));
    return (add_ordered (y, z, x, count));
  }

  public boolean isPower() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (PowerLong_yzx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    // Note that any suppression that doesn't limit x to valid exponents
    // (>= 0), must check for valid exponents as well (so that the invariant
    // is correctly destroyed on invalid exponents)
    //
    // Note also that pow(0,0) == 1 and pow(0,x), where (x > 0), == 0
    // Another interesting artificat of pow is that for any even base, any
    // exponent >= 64 will yield a result of 0.  For example, pow(10,256) == 0
    // (at least for integers)

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 1) && (x == 0) ==> r = pow (z, x)
        new NISuppression (result_eq_1, arg2_eq_0, suppressee),

        // (r == 1) && (z == 1) && (x >= 0)   ==> r = pow (z, x)
        new NISuppression (result_eq_1, arg1_eq_1, arg2_ge_0, suppressee),

        // (r == 0) && (z == 0) && (x > 0)
        new NISuppression (result_eq_0, arg1_eq_0, arg2_ne_0, arg2_ge_0,
                          suppressee),

        // (r == z) && (x == 1)    ==> r = pow (z, x)
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),

        // (r == 0) && (z even) && (x >= 64)
        // with each multiply there is one more zero in the result and since
        // a long has 64 bits in it, it becomes zero at that point
        new NISuppression (result_eq_0, arg1_even, arg2_ge_64, suppressee),

        // (r == 1) && (z boolean) && (z==0 <==> x==0) && (x >= 0)
        // 1 = pow (0, x) true iff (x == 0)
        // 1 = pow (1, x) true when x valid exponent
        new NISuppression (arg1_track0_arg2, arg2_ge_0, arg1_boolean,
                           result_eq_1, suppressee),

        // (r == z) && (r boolean) && (x > 0)
        // 0 = pow (0, x) true when x != 0
        // 1 = pow (1, x) true when x valid exponent
        new NISuppression (result_eq_arg1, result_boolean, arg2_ne_0,
                           arg2_ge_0, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Power (y, x)</samp>
 * over three long scalars.
 */
public static class PowerLong_zyx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ PowerLong_zyx proto;

  /** Returns the prototype invariant for PowerLong_zyx **/
  public static /*@Prototype*/ PowerLong_zyx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ PowerLong_zyx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected PowerLong_zyx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new PowerLong_zyx (slice);
  }

  private PowerLong_zyx (PptSlice slice) {
    super (slice);
  }

  public PowerLong_zyx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"java.lang.Math.pow(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert PowerLong_zyx.function_id == -1;
    PowerLong_zyx.function_id = function_id;
  }

  private static int var_order = 6;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long x) {

    return (MathMDE.pow (y, x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, y, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, y, x));
    return (add_ordered (z, y, x, count));
  }

  public boolean isPower() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (PowerLong_zyx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    // Note that any suppression that doesn't limit x to valid exponents
    // (>= 0), must check for valid exponents as well (so that the invariant
    // is correctly destroyed on invalid exponents)
    //
    // Note also that pow(0,0) == 1 and pow(0,x), where (x > 0), == 0
    // Another interesting artificat of pow is that for any even base, any
    // exponent >= 64 will yield a result of 0.  For example, pow(10,256) == 0
    // (at least for integers)

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 1) && (x == 0) ==> r = pow (y, x)
        new NISuppression (result_eq_1, arg2_eq_0, suppressee),

        // (r == 1) && (y == 1) && (x >= 0)   ==> r = pow (y, x)
        new NISuppression (result_eq_1, arg1_eq_1, arg2_ge_0, suppressee),

        // (r == 0) && (y == 0) && (x > 0)
        new NISuppression (result_eq_0, arg1_eq_0, arg2_ne_0, arg2_ge_0,
                          suppressee),

        // (r == y) && (x == 1)    ==> r = pow (y, x)
        new NISuppression (result_eq_arg1, arg2_eq_1, suppressee),

        // (r == 0) && (y even) && (x >= 64)
        // with each multiply there is one more zero in the result and since
        // a long has 64 bits in it, it becomes zero at that point
        new NISuppression (result_eq_0, arg1_even, arg2_ge_64, suppressee),

        // (r == 1) && (y boolean) && (y==0 <==> x==0) && (x >= 0)
        // 1 = pow (0, x) true iff (x == 0)
        // 1 = pow (1, x) true when x valid exponent
        new NISuppression (arg1_track0_arg2, arg2_ge_0, arg1_boolean,
                           result_eq_1, suppressee),

        // (r == y) && (r boolean) && (x > 0)
        // 0 = pow (0, x) true when x != 0
        // 1 = pow (1, x) true when x valid exponent
        new NISuppression (result_eq_arg1, result_boolean, arg2_ne_0,
                           arg2_ge_0, suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // "define" EQUALITY_SUPPRESS 1

  // default is that it is not this function, overriden in the subclass
  public boolean isBitwiseAnd () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = BitwiseAnd (y, z)</samp>
 * over three long scalars.
 */
public static class BitwiseAndLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ BitwiseAndLong_xyz proto;

  /** Returns the prototype invariant for BitwiseAndLong_xyz **/
  public static /*@Prototype*/ BitwiseAndLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ BitwiseAndLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected BitwiseAndLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new BitwiseAndLong_xyz (slice);
  }

  private BitwiseAndLong_xyz (PptSlice slice) {
    super (slice);
  }

  public BitwiseAndLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " & ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert BitwiseAndLong_xyz.function_id == -1;
    BitwiseAndLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

    return ((y & z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isBitwiseAnd() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (BitwiseAndLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (y == z) && (r == z) ==> r = y &  z
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           suppressee),

        // (r == y) && (y bitwise subset z)
        new NISuppression (result_eq_arg1, arg1_bw_subset_arg2, suppressee),

        // (r == z) && (z bitwise subset y)
        new NISuppression (result_eq_arg2, arg2_bw_subset_arg1, suppressee),

        // (r == 0) && (y & z == 0) ==> r = y & z
        new NISuppression (result_eq_0, arg1_and0_arg2, suppressee),

        // All of these are subsummed by the prior one
        // (r == 0) && (y == 0) ==> r = y & z
        // new NISuppression (result_eq_0, arg1_eq_0, suppressee),

        // (r == 0) && (z == 0) ==> r = y & z
        // new NISuppression (result_eq_0, arg2_eq_0, suppressee),

        // (r == 0) && (y boolean) && (z is even)
        // new NISuppression (result_eq_0, arg1_boolean, arg2_even,suppressee),

        // (r == 0) && (z boolean) && (y is even)
        // new NISuppression (result_eq_0, arg2_boolean, arg1_even,suppressee),

        // (r == 0) && (z > y) && (z power2) && (y >= 0)
        // new NISuppression (result_eq_0, arg1_lt_arg2, arg2_power2,arg1_ge_0,
        //                   suppressee),

        // (r == 0) && (y > z) && (y power2) && (z >= 0)
        // new NISuppression (result_eq_0, arg2_lt_arg1, arg1_power2,arg2_ge_0,
        //                   suppressee),

        // (r == y) && (r boolean) && (z == 1)
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_1,
                           suppressee),

        // (r == z) && (r boolean) && (y == 1)
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_1,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = BitwiseAnd (x, z)</samp>
 * over three long scalars.
 */
public static class BitwiseAndLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ BitwiseAndLong_yxz proto;

  /** Returns the prototype invariant for BitwiseAndLong_yxz **/
  public static /*@Prototype*/ BitwiseAndLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ BitwiseAndLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected BitwiseAndLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new BitwiseAndLong_yxz (slice);
  }

  private BitwiseAndLong_yxz (PptSlice slice) {
    super (slice);
  }

  public BitwiseAndLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " & ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert BitwiseAndLong_yxz.function_id == -1;
    BitwiseAndLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

    return ((x & z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isBitwiseAnd() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (BitwiseAndLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (x == z) && (r == z) ==> r = x &  z
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           suppressee),

        // (r == x) && (x bitwise subset z)
        new NISuppression (result_eq_arg1, arg1_bw_subset_arg2, suppressee),

        // (r == z) && (z bitwise subset x)
        new NISuppression (result_eq_arg2, arg2_bw_subset_arg1, suppressee),

        // (r == 0) && (x & z == 0) ==> r = x & z
        new NISuppression (result_eq_0, arg1_and0_arg2, suppressee),

        // All of these are subsummed by the prior one
        // (r == 0) && (x == 0) ==> r = x & z
        // new NISuppression (result_eq_0, arg1_eq_0, suppressee),

        // (r == 0) && (z == 0) ==> r = x & z
        // new NISuppression (result_eq_0, arg2_eq_0, suppressee),

        // (r == 0) && (x boolean) && (z is even)
        // new NISuppression (result_eq_0, arg1_boolean, arg2_even,suppressee),

        // (r == 0) && (z boolean) && (x is even)
        // new NISuppression (result_eq_0, arg2_boolean, arg1_even,suppressee),

        // (r == 0) && (z > x) && (z power2) && (x >= 0)
        // new NISuppression (result_eq_0, arg1_lt_arg2, arg2_power2,arg1_ge_0,
        //                   suppressee),

        // (r == 0) && (x > z) && (x power2) && (z >= 0)
        // new NISuppression (result_eq_0, arg2_lt_arg1, arg1_power2,arg2_ge_0,
        //                   suppressee),

        // (r == x) && (r boolean) && (z == 1)
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_1,
                           suppressee),

        // (r == z) && (r boolean) && (x == 1)
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_1,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = BitwiseAnd (x, y)</samp>
 * over three long scalars.
 */
public static class BitwiseAndLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ BitwiseAndLong_zxy proto;

  /** Returns the prototype invariant for BitwiseAndLong_zxy **/
  public static /*@Prototype*/ BitwiseAndLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ BitwiseAndLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected BitwiseAndLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new BitwiseAndLong_zxy (slice);
  }

  private BitwiseAndLong_zxy (PptSlice slice) {
    super (slice);
  }

  public BitwiseAndLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " & ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert BitwiseAndLong_zxy.function_id == -1;
    BitwiseAndLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

    return ((x & y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isBitwiseAnd() {
    return (true);
  }

    public boolean isExact() { return true; }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (BitwiseAndLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (x == y) && (r == y) ==> r = x &  y
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           suppressee),

        // (r == x) && (x bitwise subset y)
        new NISuppression (result_eq_arg1, arg1_bw_subset_arg2, suppressee),

        // (r == y) && (y bitwise subset x)
        new NISuppression (result_eq_arg2, arg2_bw_subset_arg1, suppressee),

        // (r == 0) && (x & y == 0) ==> r = x & y
        new NISuppression (result_eq_0, arg1_and0_arg2, suppressee),

        // All of these are subsummed by the prior one
        // (r == 0) && (x == 0) ==> r = x & y
        // new NISuppression (result_eq_0, arg1_eq_0, suppressee),

        // (r == 0) && (y == 0) ==> r = x & y
        // new NISuppression (result_eq_0, arg2_eq_0, suppressee),

        // (r == 0) && (x boolean) && (y is even)
        // new NISuppression (result_eq_0, arg1_boolean, arg2_even,suppressee),

        // (r == 0) && (y boolean) && (x is even)
        // new NISuppression (result_eq_0, arg2_boolean, arg1_even,suppressee),

        // (r == 0) && (y > x) && (y power2) && (x >= 0)
        // new NISuppression (result_eq_0, arg1_lt_arg2, arg2_power2,arg1_ge_0,
        //                   suppressee),

        // (r == 0) && (x > y) && (x power2) && (y >= 0)
        // new NISuppression (result_eq_0, arg2_lt_arg1, arg1_power2,arg2_ge_0,
        //                   suppressee),

        // (r == x) && (r boolean) && (y == 1)
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_1,
                           suppressee),

        // (r == y) && (r boolean) && (x == 1)
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_1,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // default is that it is not this function, overriden in the subclass
  public boolean isLogicalAnd () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = LogicalAnd (y, z)</samp>
 * over three long scalars.
 */
public static class LogicalAndLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ LogicalAndLong_xyz proto;

  /** Returns the prototype invariant for LogicalAndLong_xyz **/
  public static /*@Prototype*/ LogicalAndLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LogicalAndLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LogicalAndLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LogicalAndLong_xyz (slice);
  }

  private LogicalAndLong_xyz (PptSlice slice) {
    super (slice);
  }

  public LogicalAndLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " && ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LogicalAndLong_xyz.function_id == -1;
    LogicalAndLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

      if ((y < 0) || (y > 1))
        throw new ArithmeticException ("arg1 (" + y + ") is not boolean ");
      if ((z < 0) || (z > 1))
        throw new ArithmeticException ("arg2 (" + z + ") is not boolean ");

    return ((((y != 0) && ( z != 0)) ? 1 : 0));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isLogicalAnd() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LogicalAndLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (y == z) && (r == z) && (r is boolean)
        //    ==> r = y && z
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           result_boolean, suppressee),

        // (r == 0) && (y == 0) && (z is boolean) ==> r = y && z
        new NISuppression (result_eq_0, arg1_eq_0, arg2_boolean, suppressee),

        // (r == 0) && (z == 0) && (y is boolean) ==> r = y && z
        new NISuppression (result_eq_0, arg2_eq_0, arg1_boolean, suppressee),

        // (r == 0) && (y == 0) && (z boolean) ==> r = y && z
        new NISuppression (result_eq_0, arg1_eq_0, arg2_boolean, suppressee),

        // (r == 0) && (z == 0) && (y boolean) ==> r = y && z
        new NISuppression (result_eq_0, arg2_eq_0, arg1_boolean, suppressee),

        // (r == y) && (r boolean) && (z == 1)
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_1,
                           suppressee),

        // (r == z) && (r boolean) && (y == 1)
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_1,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = LogicalAnd (x, z)</samp>
 * over three long scalars.
 */
public static class LogicalAndLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ LogicalAndLong_yxz proto;

  /** Returns the prototype invariant for LogicalAndLong_yxz **/
  public static /*@Prototype*/ LogicalAndLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LogicalAndLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LogicalAndLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LogicalAndLong_yxz (slice);
  }

  private LogicalAndLong_yxz (PptSlice slice) {
    super (slice);
  }

  public LogicalAndLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " && ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LogicalAndLong_yxz.function_id == -1;
    LogicalAndLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

      if ((x < 0) || (x > 1))
        throw new ArithmeticException ("arg1 (" + x + ") is not boolean ");
      if ((z < 0) || (z > 1))
        throw new ArithmeticException ("arg2 (" + z + ") is not boolean ");

    return ((((x != 0) && ( z != 0)) ? 1 : 0));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isLogicalAnd() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LogicalAndLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (x == z) && (r == z) && (r is boolean)
        //    ==> r = x && z
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           result_boolean, suppressee),

        // (r == 0) && (x == 0) && (z is boolean) ==> r = x && z
        new NISuppression (result_eq_0, arg1_eq_0, arg2_boolean, suppressee),

        // (r == 0) && (z == 0) && (x is boolean) ==> r = x && z
        new NISuppression (result_eq_0, arg2_eq_0, arg1_boolean, suppressee),

        // (r == 0) && (x == 0) && (z boolean) ==> r = x && z
        new NISuppression (result_eq_0, arg1_eq_0, arg2_boolean, suppressee),

        // (r == 0) && (z == 0) && (x boolean) ==> r = x && z
        new NISuppression (result_eq_0, arg2_eq_0, arg1_boolean, suppressee),

        // (r == x) && (r boolean) && (z == 1)
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_1,
                           suppressee),

        // (r == z) && (r boolean) && (x == 1)
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_1,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = LogicalAnd (x, y)</samp>
 * over three long scalars.
 */
public static class LogicalAndLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ LogicalAndLong_zxy proto;

  /** Returns the prototype invariant for LogicalAndLong_zxy **/
  public static /*@Prototype*/ LogicalAndLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LogicalAndLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LogicalAndLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LogicalAndLong_zxy (slice);
  }

  private LogicalAndLong_zxy (PptSlice slice) {
    super (slice);
  }

  public LogicalAndLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " && ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LogicalAndLong_zxy.function_id == -1;
    LogicalAndLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

      if ((x < 0) || (x > 1))
        throw new ArithmeticException ("arg1 (" + x + ") is not boolean ");
      if ((y < 0) || (y > 1))
        throw new ArithmeticException ("arg2 (" + y + ") is not boolean ");

    return ((((x != 0) && ( y != 0)) ? 1 : 0));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isLogicalAnd() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LogicalAndLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (x == y) && (r == y) && (r is boolean)
        //    ==> r = x && y
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           result_boolean, suppressee),

        // (r == 0) && (x == 0) && (y is boolean) ==> r = x && y
        new NISuppression (result_eq_0, arg1_eq_0, arg2_boolean, suppressee),

        // (r == 0) && (y == 0) && (x is boolean) ==> r = x && y
        new NISuppression (result_eq_0, arg2_eq_0, arg1_boolean, suppressee),

        // (r == 0) && (x == 0) && (y boolean) ==> r = x && y
        new NISuppression (result_eq_0, arg1_eq_0, arg2_boolean, suppressee),

        // (r == 0) && (y == 0) && (x boolean) ==> r = x && y
        new NISuppression (result_eq_0, arg2_eq_0, arg1_boolean, suppressee),

        // (r == x) && (r boolean) && (y == 1)
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_1,
                           suppressee),

        // (r == y) && (r boolean) && (x == 1)
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_1,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // default is that it is not this function, overriden in the subclass
  public boolean isBitwiseXor () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = BitwiseXor (y, z)</samp>
 * over three long scalars.
 */
public static class BitwiseXorLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ BitwiseXorLong_xyz proto;

  /** Returns the prototype invariant for BitwiseXorLong_xyz **/
  public static /*@Prototype*/ BitwiseXorLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ BitwiseXorLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected BitwiseXorLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new BitwiseXorLong_xyz (slice);
  }

  private BitwiseXorLong_xyz (PptSlice slice) {
    super (slice);
  }

  public BitwiseXorLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " ^ ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert BitwiseXorLong_xyz.function_id == -1;
    BitwiseXorLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

    return ((y ^ z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isBitwiseXor() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (BitwiseXorLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (y == z) ==> r = y ^ z
        new NISuppression (result_eq_0, arg1_eq_arg2, suppressee),

        // (r == y) && (z == 0) ==> r = y ^ z
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == z) && (y == 0) ==> r = y ^ z
        new NISuppression (result_eq_arg2, arg1_eq_0, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = BitwiseXor (x, z)</samp>
 * over three long scalars.
 */
public static class BitwiseXorLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ BitwiseXorLong_yxz proto;

  /** Returns the prototype invariant for BitwiseXorLong_yxz **/
  public static /*@Prototype*/ BitwiseXorLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ BitwiseXorLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected BitwiseXorLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new BitwiseXorLong_yxz (slice);
  }

  private BitwiseXorLong_yxz (PptSlice slice) {
    super (slice);
  }

  public BitwiseXorLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " ^ ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert BitwiseXorLong_yxz.function_id == -1;
    BitwiseXorLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

    return ((x ^ z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isBitwiseXor() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (BitwiseXorLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (x == z) ==> r = x ^ z
        new NISuppression (result_eq_0, arg1_eq_arg2, suppressee),

        // (r == x) && (z == 0) ==> r = x ^ z
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == z) && (x == 0) ==> r = x ^ z
        new NISuppression (result_eq_arg2, arg1_eq_0, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = BitwiseXor (x, y)</samp>
 * over three long scalars.
 */
public static class BitwiseXorLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ BitwiseXorLong_zxy proto;

  /** Returns the prototype invariant for BitwiseXorLong_zxy **/
  public static /*@Prototype*/ BitwiseXorLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ BitwiseXorLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected BitwiseXorLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new BitwiseXorLong_zxy (slice);
  }

  private BitwiseXorLong_zxy (PptSlice slice) {
    super (slice);
  }

  public BitwiseXorLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " ^ ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert BitwiseXorLong_zxy.function_id == -1;
    BitwiseXorLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

    return ((x ^ y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isBitwiseXor() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (BitwiseXorLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (x == y) ==> r = x ^ y
        new NISuppression (result_eq_0, arg1_eq_arg2, suppressee),

        // (r == x) && (y == 0) ==> r = x ^ y
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == y) && (x == 0) ==> r = x ^ y
        new NISuppression (result_eq_arg2, arg1_eq_0, suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // "define" METHOD_NAME {"", " ^ ", ""}

  // default is that it is not this function, overriden in the subclass
  public boolean isLogicalXor () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = LogicalXor (y, z)</samp>
 * over three long scalars.
 */
public static class LogicalXorLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ LogicalXorLong_xyz proto;

  /** Returns the prototype invariant for LogicalXorLong_xyz **/
  public static /*@Prototype*/ LogicalXorLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LogicalXorLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LogicalXorLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LogicalXorLong_xyz (slice);
  }

  private LogicalXorLong_xyz (PptSlice slice) {
    super (slice);
  }

  public LogicalXorLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"plume.MathMDE.logicalXor(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LogicalXorLong_xyz.function_id == -1;
    LogicalXorLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

      if ((y < 0) || (y > 1))
        throw new ArithmeticException ("arg1 (" + y + ") is not boolean ");
      if ((z < 0) || (z > 1))
        throw new ArithmeticException ("arg2 (" + z + ") is not boolean ");

    return ((((y != 0) ^ ( z != 0)) ? 1 : 0));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isLogicalXor() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LogicalXorLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (y == z) && (y boolean) ==> r = y ^ z
        new NISuppression (arg1_eq_arg2, arg1_boolean, result_eq_0,
                           suppressee),

        // (r == y) && (z == 0) && (x boolean) ==> r = y ^ z
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_0,
                           suppressee),

        // (r == z) && (y == 0) && (x boolean)==> r = y ^ z
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_0,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = LogicalXor (x, z)</samp>
 * over three long scalars.
 */
public static class LogicalXorLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ LogicalXorLong_yxz proto;

  /** Returns the prototype invariant for LogicalXorLong_yxz **/
  public static /*@Prototype*/ LogicalXorLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LogicalXorLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LogicalXorLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LogicalXorLong_yxz (slice);
  }

  private LogicalXorLong_yxz (PptSlice slice) {
    super (slice);
  }

  public LogicalXorLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"plume.MathMDE.logicalXor(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LogicalXorLong_yxz.function_id == -1;
    LogicalXorLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

      if ((x < 0) || (x > 1))
        throw new ArithmeticException ("arg1 (" + x + ") is not boolean ");
      if ((z < 0) || (z > 1))
        throw new ArithmeticException ("arg2 (" + z + ") is not boolean ");

    return ((((x != 0) ^ ( z != 0)) ? 1 : 0));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isLogicalXor() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LogicalXorLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (x == z) && (x boolean) ==> r = x ^ z
        new NISuppression (arg1_eq_arg2, arg1_boolean, result_eq_0,
                           suppressee),

        // (r == x) && (z == 0) && (y boolean) ==> r = x ^ z
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_0,
                           suppressee),

        // (r == z) && (x == 0) && (y boolean)==> r = x ^ z
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_0,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = LogicalXor (x, y)</samp>
 * over three long scalars.
 */
public static class LogicalXorLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ LogicalXorLong_zxy proto;

  /** Returns the prototype invariant for LogicalXorLong_zxy **/
  public static /*@Prototype*/ LogicalXorLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LogicalXorLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LogicalXorLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LogicalXorLong_zxy (slice);
  }

  private LogicalXorLong_zxy (PptSlice slice) {
    super (slice);
  }

  public LogicalXorLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"plume.MathMDE.logicalXor(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LogicalXorLong_zxy.function_id == -1;
    LogicalXorLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

      if ((x < 0) || (x > 1))
        throw new ArithmeticException ("arg1 (" + x + ") is not boolean ");
      if ((y < 0) || (y > 1))
        throw new ArithmeticException ("arg2 (" + y + ") is not boolean ");

    return ((((x != 0) ^ ( y != 0)) ? 1 : 0));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isLogicalXor() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LogicalXorLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == 0) && (x == y) && (x boolean) ==> r = x ^ y
        new NISuppression (arg1_eq_arg2, arg1_boolean, result_eq_0,
                           suppressee),

        // (r == x) && (y == 0) && (z boolean) ==> r = x ^ y
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_0,
                           suppressee),

        // (r == y) && (x == 0) && (z boolean)==> r = x ^ y
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_0,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // "define" EQUALITY_SUPPRESS 1

  // default is that it is not this function, overriden in the subclass
  public boolean isBitwiseOr () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = BitwiseOr (y, z)</samp>
 * over three long scalars.
 */
public static class BitwiseOrLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ BitwiseOrLong_xyz proto;

  /** Returns the prototype invariant for BitwiseOrLong_xyz **/
  public static /*@Prototype*/ BitwiseOrLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ BitwiseOrLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected BitwiseOrLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new BitwiseOrLong_xyz (slice);
  }

  private BitwiseOrLong_xyz (PptSlice slice) {
    super (slice);
  }

  public BitwiseOrLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " | ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert BitwiseOrLong_xyz.function_id == -1;
    BitwiseOrLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

    return ((y | z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isBitwiseOr() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (BitwiseOrLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (z bitwise subset y)
        new NISuppression (result_eq_arg1, arg2_bw_subset_arg1, suppressee),

        // (r == z) && (y bitwise subset z)
        new NISuppression (result_eq_arg2, arg1_bw_subset_arg2, suppressee),

        // All of the below are subsummed by the two above
        // (r == y) && (y == z) ==> r = y | z
        // new NISuppression (result_eq_arg1, arg1_eq_arg2, suppressee),

        // (r == y) && (z == 0) ==> r = y | z
        // new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == z) && (y == 0) ==> r = y | z
        // new NISuppression (result_eq_arg2, arg1_eq_0, suppressee),

        // (r == 1) && (y == 1) && (z boolean)
        // new NISuppression (result_eq_1, arg1_eq_1, arg2_boolean, suppressee),

        // (r == 1) && (z == 1) && (y boolean)
        // new NISuppression (result_eq_1, arg2_eq_1, arg1_boolean, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = BitwiseOr (x, z)</samp>
 * over three long scalars.
 */
public static class BitwiseOrLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ BitwiseOrLong_yxz proto;

  /** Returns the prototype invariant for BitwiseOrLong_yxz **/
  public static /*@Prototype*/ BitwiseOrLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ BitwiseOrLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected BitwiseOrLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new BitwiseOrLong_yxz (slice);
  }

  private BitwiseOrLong_yxz (PptSlice slice) {
    super (slice);
  }

  public BitwiseOrLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " | ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert BitwiseOrLong_yxz.function_id == -1;
    BitwiseOrLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

    return ((x | z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isBitwiseOr() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (BitwiseOrLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (z bitwise subset x)
        new NISuppression (result_eq_arg1, arg2_bw_subset_arg1, suppressee),

        // (r == z) && (x bitwise subset z)
        new NISuppression (result_eq_arg2, arg1_bw_subset_arg2, suppressee),

        // All of the below are subsummed by the two above
        // (r == x) && (x == z) ==> r = x | z
        // new NISuppression (result_eq_arg1, arg1_eq_arg2, suppressee),

        // (r == x) && (z == 0) ==> r = x | z
        // new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == z) && (x == 0) ==> r = x | z
        // new NISuppression (result_eq_arg2, arg1_eq_0, suppressee),

        // (r == 1) && (x == 1) && (z boolean)
        // new NISuppression (result_eq_1, arg1_eq_1, arg2_boolean, suppressee),

        // (r == 1) && (z == 1) && (x boolean)
        // new NISuppression (result_eq_1, arg2_eq_1, arg1_boolean, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = BitwiseOr (x, y)</samp>
 * over three long scalars.
 */
public static class BitwiseOrLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ BitwiseOrLong_zxy proto;

  /** Returns the prototype invariant for BitwiseOrLong_zxy **/
  public static /*@Prototype*/ BitwiseOrLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ BitwiseOrLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected BitwiseOrLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new BitwiseOrLong_zxy (slice);
  }

  private BitwiseOrLong_zxy (PptSlice slice) {
    super (slice);
  }

  public BitwiseOrLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " | ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert BitwiseOrLong_zxy.function_id == -1;
    BitwiseOrLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

    return ((x | y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isBitwiseOr() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (BitwiseOrLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (y bitwise subset x)
        new NISuppression (result_eq_arg1, arg2_bw_subset_arg1, suppressee),

        // (r == y) && (x bitwise subset y)
        new NISuppression (result_eq_arg2, arg1_bw_subset_arg2, suppressee),

        // All of the below are subsummed by the two above
        // (r == x) && (x == y) ==> r = x | y
        // new NISuppression (result_eq_arg1, arg1_eq_arg2, suppressee),

        // (r == x) && (y == 0) ==> r = x | y
        // new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == y) && (x == 0) ==> r = x | y
        // new NISuppression (result_eq_arg2, arg1_eq_0, suppressee),

        // (r == 1) && (x == 1) && (y boolean)
        // new NISuppression (result_eq_1, arg1_eq_1, arg2_boolean, suppressee),

        // (r == 1) && (y == 1) && (x boolean)
        // new NISuppression (result_eq_1, arg2_eq_1, arg1_boolean, suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // default is that it is not this function, overriden in the subclass
  public boolean isLogicalOr () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = LogicalOr (y, z)</samp>
 * over three long scalars.
 */
public static class LogicalOrLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ LogicalOrLong_xyz proto;

  /** Returns the prototype invariant for LogicalOrLong_xyz **/
  public static /*@Prototype*/ LogicalOrLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LogicalOrLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LogicalOrLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LogicalOrLong_xyz (slice);
  }

  private LogicalOrLong_xyz (PptSlice slice) {
    super (slice);
  }

  public LogicalOrLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " || ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LogicalOrLong_xyz.function_id == -1;
    LogicalOrLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

      if ((y < 0) || (y > 1))
        throw new ArithmeticException ("arg1 (" + y + ") is not boolean ");
      if ((z < 0) || (z > 1))
        throw new ArithmeticException ("arg2 (" + z + ") is not boolean ");

    return ((((y != 0) || ( z != 0)) ? 1 : 0));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isLogicalOr() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LogicalOrLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // Note that
        // x == y && y == z does NOT imply x == z because of possibly
        // missing values.  For example:
        //
        //  Sample    X         Y           Z
        //    1       1         1           missing
        //    2       0         missing     1
        //    3       missing   0           0
        //
        //  The best solution seems to be to include all three
        //  equalities for the suppression

        // (r == y) && (y == z) && (r == z) && (r is boolean)
        //    ==> r = y | z
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           result_boolean, suppressee),

        // (r == y) && (z == 0) && (r is boolean) ==> r = y | z
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_0,
                           suppressee),

        // (r == z) && (y == 0) && (r is boolean) ==> r = y | z
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_0,
                           suppressee),

        // (r == 1) && (y == 1) && (z boolean)
        new NISuppression (result_eq_1, arg1_eq_1, arg2_boolean, suppressee),

        // (r == 1) && (z == 1) && (y boolean)
        new NISuppression (result_eq_1, arg2_eq_1, arg1_boolean, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = LogicalOr (x, z)</samp>
 * over three long scalars.
 */
public static class LogicalOrLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ LogicalOrLong_yxz proto;

  /** Returns the prototype invariant for LogicalOrLong_yxz **/
  public static /*@Prototype*/ LogicalOrLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LogicalOrLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LogicalOrLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LogicalOrLong_yxz (slice);
  }

  private LogicalOrLong_yxz (PptSlice slice) {
    super (slice);
  }

  public LogicalOrLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " || ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LogicalOrLong_yxz.function_id == -1;
    LogicalOrLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

      if ((x < 0) || (x > 1))
        throw new ArithmeticException ("arg1 (" + x + ") is not boolean ");
      if ((z < 0) || (z > 1))
        throw new ArithmeticException ("arg2 (" + z + ") is not boolean ");

    return ((((x != 0) || ( z != 0)) ? 1 : 0));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isLogicalOr() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LogicalOrLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // Note that
        // x == y && y == z does NOT imply x == z because of possibly
        // missing values.  For example:
        //
        //  Sample    X         Y           Z
        //    1       1         1           missing
        //    2       0         missing     1
        //    3       missing   0           0
        //
        //  The best solution seems to be to include all three
        //  equalities for the suppression

        // (r == x) && (x == z) && (r == z) && (r is boolean)
        //    ==> r = x | z
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           result_boolean, suppressee),

        // (r == x) && (z == 0) && (r is boolean) ==> r = x | z
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_0,
                           suppressee),

        // (r == z) && (x == 0) && (r is boolean) ==> r = x | z
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_0,
                           suppressee),

        // (r == 1) && (x == 1) && (z boolean)
        new NISuppression (result_eq_1, arg1_eq_1, arg2_boolean, suppressee),

        // (r == 1) && (z == 1) && (x boolean)
        new NISuppression (result_eq_1, arg2_eq_1, arg1_boolean, suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = LogicalOr (x, y)</samp>
 * over three long scalars.
 */
public static class LogicalOrLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ LogicalOrLong_zxy proto;

  /** Returns the prototype invariant for LogicalOrLong_zxy **/
  public static /*@Prototype*/ LogicalOrLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LogicalOrLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LogicalOrLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LogicalOrLong_zxy (slice);
  }

  private LogicalOrLong_zxy (PptSlice slice) {
    super (slice);
  }

  public LogicalOrLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " || ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LogicalOrLong_zxy.function_id == -1;
    LogicalOrLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

      if ((x < 0) || (x > 1))
        throw new ArithmeticException ("arg1 (" + x + ") is not boolean ");
      if ((y < 0) || (y > 1))
        throw new ArithmeticException ("arg2 (" + y + ") is not boolean ");

    return ((((x != 0) || ( y != 0)) ? 1 : 0));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isLogicalOr() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LogicalOrLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // Note that
        // x == y && y == z does NOT imply x == z because of possibly
        // missing values.  For example:
        //
        //  Sample    X         Y           Z
        //    1       1         1           missing
        //    2       0         missing     1
        //    3       missing   0           0
        //
        //  The best solution seems to be to include all three
        //  equalities for the suppression

        // (r == x) && (x == y) && (r == y) && (r is boolean)
        //    ==> r = x | y
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           result_boolean, suppressee),

        // (r == x) && (y == 0) && (r is boolean) ==> r = x | y
        new NISuppression (result_eq_arg1, result_boolean, arg2_eq_0,
                           suppressee),

        // (r == y) && (x == 0) && (r is boolean) ==> r = x | y
        new NISuppression (result_eq_arg2, result_boolean, arg1_eq_0,
                           suppressee),

        // (r == 1) && (x == 1) && (y boolean)
        new NISuppression (result_eq_1, arg1_eq_1, arg2_boolean, suppressee),

        // (r == 1) && (y == 1) && (x boolean)
        new NISuppression (result_eq_1, arg2_eq_1, arg1_boolean, suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // "define" EQUALITY_SUPPRESS 1

  // default is that it is not this function, overriden in the subclass
  public boolean isGcd () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = Gcd (y, z)</samp>
 * over three long scalars.
 */
public static class GcdLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ GcdLong_xyz proto;

  /** Returns the prototype invariant for GcdLong_xyz **/
  public static /*@Prototype*/ GcdLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ GcdLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected GcdLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new GcdLong_xyz (slice);
  }

  private GcdLong_xyz (PptSlice slice) {
    super (slice);
  }

  public GcdLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"plume.MathMDE.gcd(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert GcdLong_xyz.function_id == -1;
    GcdLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long y, long z) {

    return (MathMDE.gcd (y, z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isGcd() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (GcdLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    // gcd (0, y) == y
    // gcd (0, 0) == 0
    // gcd (1, y) == 1

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (y == z) && (r == z) && (r >= 0)
        //    ==> r = Gcd (y, z)
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           result_ge_0, suppressee),

        // (r == y) && (z == 0) && (r >= 0) ==> r = gcd (y,z)
        new NISuppression (result_eq_arg1, result_ge_0, arg2_eq_0, suppressee),

        // (r == z) && (y == 0) && (r >= 0) ==> r = gcd (y,z)
        new NISuppression (result_eq_arg2, result_ge_0, arg1_eq_0, suppressee),

        // (r == 1) && (z == 1)        ==> r = gcd (y, art2)
        new NISuppression (result_eq_1, arg2_eq_1, suppressee),

        // (r == 1) && (y == 1)        ==> r = gcd (y, art2)
        new NISuppression (result_eq_1, arg1_eq_1, suppressee),

        // (r == y) && (y divides z) && (r >= 0)
        new NISuppression (result_eq_arg1, arg1_divides_arg2, result_ge_0, suppressee),

        // (r == z) && (z divides y) && (r >= 0)
        new NISuppression (result_eq_arg2, arg2_divides_arg1, result_ge_0, suppressee),

        // (r == z) && (z boolean) && (z==0 ==> y==0)
        // 0 = gcd (y, 0) true when (y == 0)
        // 1 = gcd (y, 1) always true
        new NISuppression (result_eq_arg2, arg2_track0_arg1, arg2_boolean,
                           suppressee),

        // (r == y) && (y boolean) && (y==0 ==> z==0)
        // 0 = gcd (0, z), true if (z == 0)
        // 1 = gcd (1, z), always true
        new NISuppression (result_eq_arg1, arg1_boolean, arg1_track0_arg2,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Gcd (x, z)</samp>
 * over three long scalars.
 */
public static class GcdLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ GcdLong_yxz proto;

  /** Returns the prototype invariant for GcdLong_yxz **/
  public static /*@Prototype*/ GcdLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ GcdLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected GcdLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new GcdLong_yxz (slice);
  }

  private GcdLong_yxz (PptSlice slice) {
    super (slice);
  }

  public GcdLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"plume.MathMDE.gcd(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert GcdLong_yxz.function_id == -1;
    GcdLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long z) {

    return (MathMDE.gcd (x, z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isGcd() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (GcdLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    // gcd (0, y) == y
    // gcd (0, 0) == 0
    // gcd (1, y) == 1

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (x == z) && (r == z) && (r >= 0)
        //    ==> r = Gcd (x, z)
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           result_ge_0, suppressee),

        // (r == x) && (z == 0) && (r >= 0) ==> r = gcd (x,z)
        new NISuppression (result_eq_arg1, result_ge_0, arg2_eq_0, suppressee),

        // (r == z) && (x == 0) && (r >= 0) ==> r = gcd (x,z)
        new NISuppression (result_eq_arg2, result_ge_0, arg1_eq_0, suppressee),

        // (r == 1) && (z == 1)        ==> r = gcd (x, art2)
        new NISuppression (result_eq_1, arg2_eq_1, suppressee),

        // (r == 1) && (x == 1)        ==> r = gcd (x, art2)
        new NISuppression (result_eq_1, arg1_eq_1, suppressee),

        // (r == x) && (x divides z) && (r >= 0)
        new NISuppression (result_eq_arg1, arg1_divides_arg2, result_ge_0, suppressee),

        // (r == z) && (z divides x) && (r >= 0)
        new NISuppression (result_eq_arg2, arg2_divides_arg1, result_ge_0, suppressee),

        // (r == z) && (z boolean) && (z==0 ==> x==0)
        // 0 = gcd (x, 0) true when (x == 0)
        // 1 = gcd (x, 1) always true
        new NISuppression (result_eq_arg2, arg2_track0_arg1, arg2_boolean,
                           suppressee),

        // (r == x) && (x boolean) && (x==0 ==> z==0)
        // 0 = gcd (0, z), true if (z == 0)
        // 1 = gcd (1, z), always true
        new NISuppression (result_eq_arg1, arg1_boolean, arg1_track0_arg2,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Gcd (x, y)</samp>
 * over three long scalars.
 */
public static class GcdLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ GcdLong_zxy proto;

  /** Returns the prototype invariant for GcdLong_zxy **/
  public static /*@Prototype*/ GcdLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ GcdLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected GcdLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new GcdLong_zxy (slice);
  }

  private GcdLong_zxy (PptSlice slice) {
    super (slice);
  }

  public GcdLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"plume.MathMDE.gcd(", ", ", ")"};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert GcdLong_zxy.function_id == -1;
    GcdLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (true);
  }

  public long func (long x, long y) {

    return (MathMDE.gcd (x, y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isGcd() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (GcdLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    // gcd (0, y) == y
    // gcd (0, 0) == 0
    // gcd (1, y) == 1

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (x == y) && (r == y) && (r >= 0)
        //    ==> r = Gcd (x, y)
        new NISuppression (result_eq_arg1, arg1_eq_arg2, result_eq_arg2,
                           result_ge_0, suppressee),

        // (r == x) && (y == 0) && (r >= 0) ==> r = gcd (x,y)
        new NISuppression (result_eq_arg1, result_ge_0, arg2_eq_0, suppressee),

        // (r == y) && (x == 0) && (r >= 0) ==> r = gcd (x,y)
        new NISuppression (result_eq_arg2, result_ge_0, arg1_eq_0, suppressee),

        // (r == 1) && (y == 1)        ==> r = gcd (x, art2)
        new NISuppression (result_eq_1, arg2_eq_1, suppressee),

        // (r == 1) && (x == 1)        ==> r = gcd (x, art2)
        new NISuppression (result_eq_1, arg1_eq_1, suppressee),

        // (r == x) && (x divides y) && (r >= 0)
        new NISuppression (result_eq_arg1, arg1_divides_arg2, result_ge_0, suppressee),

        // (r == y) && (y divides x) && (r >= 0)
        new NISuppression (result_eq_arg2, arg2_divides_arg1, result_ge_0, suppressee),

        // (r == y) && (y boolean) && (y==0 ==> x==0)
        // 0 = gcd (x, 0) true when (x == 0)
        // 1 = gcd (x, 1) always true
        new NISuppression (result_eq_arg2, arg2_track0_arg1, arg2_boolean,
                           suppressee),

        // (r == x) && (x boolean) && (x==0 ==> y==0)
        // 0 = gcd (0, y), true if (y == 0)
        // 1 = gcd (1, y), always true
        new NISuppression (result_eq_arg1, arg1_boolean, arg1_track0_arg2,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // default is that it is not this function, overriden in the subclass
  public boolean isMod () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = Mod (y, z)</samp>
 * over three long scalars.
 */
public static class ModLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ ModLong_xyz proto;

  /** Returns the prototype invariant for ModLong_xyz **/
  public static /*@Prototype*/ ModLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ ModLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected ModLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new ModLong_xyz (slice);
  }

  private ModLong_xyz (PptSlice slice) {
    super (slice);
  }

  public ModLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " % ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert ModLong_xyz.function_id == -1;
    ModLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long z) {

    return ((y % z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isMod() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (ModLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {
    // anything mod 0 is undefined
        // (r == y) && (y < z) && (z != 0) && (r >= 0) ==> r = y % z
        new NISuppression (result_eq_arg1, arg1_lt_arg2, arg2_ne_0, result_ge_0, suppressee),

        // (r == 0) && ((y % z) == 0)
        new NISuppression (result_eq_0, arg2_divides_arg1, suppressee),

        // These are unnecessary as the divides invariant handles these
        // nicely.
        // (r == 0) && (z == 1)      ==> r = y % z
        // new NISuppression (result_eq_0, arg2_eq_1, suppressee),

        // (r == 0) && (y == z)
        // new NISuppression (result_eq_0, arg1_eq_arg2, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Mod (x, z)</samp>
 * over three long scalars.
 */
public static class ModLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ ModLong_yxz proto;

  /** Returns the prototype invariant for ModLong_yxz **/
  public static /*@Prototype*/ ModLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ ModLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected ModLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new ModLong_yxz (slice);
  }

  private ModLong_yxz (PptSlice slice) {
    super (slice);
  }

  public ModLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " % ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert ModLong_yxz.function_id == -1;
    ModLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long z) {

    return ((x % z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isMod() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (ModLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {
    // anything mod 0 is undefined
        // (r == x) && (x < z) && (z != 0) && (r >= 0) ==> r = x % z
        new NISuppression (result_eq_arg1, arg1_lt_arg2, arg2_ne_0, result_ge_0, suppressee),

        // (r == 0) && ((x % z) == 0)
        new NISuppression (result_eq_0, arg2_divides_arg1, suppressee),

        // These are unnecessary as the divides invariant handles these
        // nicely.
        // (r == 0) && (z == 1)      ==> r = x % z
        // new NISuppression (result_eq_0, arg2_eq_1, suppressee),

        // (r == 0) && (x == z)
        // new NISuppression (result_eq_0, arg1_eq_arg2, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Mod (x, y)</samp>
 * over three long scalars.
 */
public static class ModLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ ModLong_zxy proto;

  /** Returns the prototype invariant for ModLong_zxy **/
  public static /*@Prototype*/ ModLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ ModLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected ModLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new ModLong_zxy (slice);
  }

  private ModLong_zxy (PptSlice slice) {
    super (slice);
  }

  public ModLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " % ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert ModLong_zxy.function_id == -1;
    ModLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long y) {

    return ((x % y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isMod() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (ModLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {
    // anything mod 0 is undefined
        // (r == x) && (x < y) && (y != 0) && (r >= 0) ==> r = x % y
        new NISuppression (result_eq_arg1, arg1_lt_arg2, arg2_ne_0, result_ge_0, suppressee),

        // (r == 0) && ((x % y) == 0)
        new NISuppression (result_eq_0, arg2_divides_arg1, suppressee),

        // These are unnecessary as the divides invariant handles these
        // nicely.
        // (r == 0) && (y == 1)      ==> r = x % y
        // new NISuppression (result_eq_0, arg2_eq_1, suppressee),

        // (r == 0) && (x == y)
        // new NISuppression (result_eq_0, arg1_eq_arg2, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>x = Mod (z, y)</samp>
 * over three long scalars.
 */
public static class ModLong_xzy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ ModLong_xzy proto;

  /** Returns the prototype invariant for ModLong_xzy **/
  public static /*@Prototype*/ ModLong_xzy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ ModLong_xzy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected ModLong_xzy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new ModLong_xzy (slice);
  }

  private ModLong_xzy (PptSlice slice) {
    super (slice);
  }

  public ModLong_xzy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " % ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert ModLong_xzy.function_id == -1;
    ModLong_xzy.function_id = function_id;
  }

  private static int var_order = 4;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long y) {

    return ((z % y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, z, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, z, y));
    return (add_ordered (x, z, y, count));
  }

  public boolean isMod() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (ModLong_xzy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {
    // anything mod 0 is undefined
        // (r == z) && (z < y) && (y != 0) && (r >= 0) ==> r = z % y
        new NISuppression (result_eq_arg1, arg1_lt_arg2, arg2_ne_0, result_ge_0, suppressee),

        // (r == 0) && ((z % y) == 0)
        new NISuppression (result_eq_0, arg2_divides_arg1, suppressee),

        // These are unnecessary as the divides invariant handles these
        // nicely.
        // (r == 0) && (y == 1)      ==> r = z % y
        // new NISuppression (result_eq_0, arg2_eq_1, suppressee),

        // (r == 0) && (z == y)
        // new NISuppression (result_eq_0, arg1_eq_arg2, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Mod (z, x)</samp>
 * over three long scalars.
 */
public static class ModLong_yzx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ ModLong_yzx proto;

  /** Returns the prototype invariant for ModLong_yzx **/
  public static /*@Prototype*/ ModLong_yzx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ ModLong_yzx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected ModLong_yzx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new ModLong_yzx (slice);
  }

  private ModLong_yzx (PptSlice slice) {
    super (slice);
  }

  public ModLong_yzx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " % ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert ModLong_yzx.function_id == -1;
    ModLong_yzx.function_id = function_id;
  }

  private static int var_order = 5;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long x) {

    return ((z % x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, z, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, z, x));
    return (add_ordered (y, z, x, count));
  }

  public boolean isMod() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (ModLong_yzx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {
    // anything mod 0 is undefined
        // (r == z) && (z < x) && (x != 0) && (r >= 0) ==> r = z % x
        new NISuppression (result_eq_arg1, arg1_lt_arg2, arg2_ne_0, result_ge_0, suppressee),

        // (r == 0) && ((z % x) == 0)
        new NISuppression (result_eq_0, arg2_divides_arg1, suppressee),

        // These are unnecessary as the divides invariant handles these
        // nicely.
        // (r == 0) && (x == 1)      ==> r = z % x
        // new NISuppression (result_eq_0, arg2_eq_1, suppressee),

        // (r == 0) && (z == x)
        // new NISuppression (result_eq_0, arg1_eq_arg2, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Mod (y, x)</samp>
 * over three long scalars.
 */
public static class ModLong_zyx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

  private static /*@Prototype*/ ModLong_zyx proto;

  /** Returns the prototype invariant for ModLong_zyx **/
  public static /*@Prototype*/ ModLong_zyx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ ModLong_zyx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected ModLong_zyx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new ModLong_zyx (slice);
  }

  private ModLong_zyx (PptSlice slice) {
    super (slice);
  }

  public ModLong_zyx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " % ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert ModLong_zyx.function_id == -1;
    ModLong_zyx.function_id = function_id;
  }

  private static int var_order = 6;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long x) {

    return ((y % x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, y, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, y, x));
    return (add_ordered (z, y, x, count));
  }

  public boolean isMod() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (ModLong_zyx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {
    // anything mod 0 is undefined
        // (r == y) && (y < x) && (x != 0) && (r >= 0) ==> r = y % x
        new NISuppression (result_eq_arg1, arg1_lt_arg2, arg2_ne_0, result_ge_0, suppressee),

        // (r == 0) && ((y % x) == 0)
        new NISuppression (result_eq_0, arg2_divides_arg1, suppressee),

        // These are unnecessary as the divides invariant handles these
        // nicely.
        // (r == 0) && (x == 1)      ==> r = y % x
        // new NISuppression (result_eq_0, arg2_eq_1, suppressee),

        // (r == 0) && (y == x)
        // new NISuppression (result_eq_0, arg1_eq_arg2, suppressee),
      });

  // Create a suppression factory for functionBinary

}

  // default is that it is not this function, overriden in the subclass
  public boolean isLshift () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = Lshift (y, z)</samp>
 * over three long scalars.
 */
public static class LshiftLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // z must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ LshiftLong_xyz proto;

  /** Returns the prototype invariant for LshiftLong_xyz **/
  public static /*@Prototype*/ LshiftLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LshiftLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LshiftLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LshiftLong_xyz (slice);
  }

  private LshiftLong_xyz (PptSlice slice) {
    super (slice);
  }

  public LshiftLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " << ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LshiftLong_xyz.function_id == -1;
    LshiftLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long z) {

      if ((z < arg2_bound[0]) || (z > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + z + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((y << z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isLshift() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LshiftLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (z == 0) ==> r = y << z
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (y == 0) && (0 <= z <= 63)   ==> r = y << z
        new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Lshift (x, z)</samp>
 * over three long scalars.
 */
public static class LshiftLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // z must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ LshiftLong_yxz proto;

  /** Returns the prototype invariant for LshiftLong_yxz **/
  public static /*@Prototype*/ LshiftLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LshiftLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LshiftLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LshiftLong_yxz (slice);
  }

  private LshiftLong_yxz (PptSlice slice) {
    super (slice);
  }

  public LshiftLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " << ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LshiftLong_yxz.function_id == -1;
    LshiftLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long z) {

      if ((z < arg2_bound[0]) || (z > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + z + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((x << z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isLshift() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LshiftLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (z == 0) ==> r = x << z
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (x == 0) && (0 <= z <= 63)   ==> r = x << z
        new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Lshift (x, y)</samp>
 * over three long scalars.
 */
public static class LshiftLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // y must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ LshiftLong_zxy proto;

  /** Returns the prototype invariant for LshiftLong_zxy **/
  public static /*@Prototype*/ LshiftLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LshiftLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LshiftLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LshiftLong_zxy (slice);
  }

  private LshiftLong_zxy (PptSlice slice) {
    super (slice);
  }

  public LshiftLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " << ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LshiftLong_zxy.function_id == -1;
    LshiftLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long y) {

      if ((y < arg2_bound[0]) || (y > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + y + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((x << y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isLshift() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LshiftLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (y == 0) ==> r = x << y
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (x == 0) && (0 <= y <= 63)   ==> r = x << y
        new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>x = Lshift (z, y)</samp>
 * over three long scalars.
 */
public static class LshiftLong_xzy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // y must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ LshiftLong_xzy proto;

  /** Returns the prototype invariant for LshiftLong_xzy **/
  public static /*@Prototype*/ LshiftLong_xzy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LshiftLong_xzy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LshiftLong_xzy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LshiftLong_xzy (slice);
  }

  private LshiftLong_xzy (PptSlice slice) {
    super (slice);
  }

  public LshiftLong_xzy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " << ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LshiftLong_xzy.function_id == -1;
    LshiftLong_xzy.function_id = function_id;
  }

  private static int var_order = 4;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long y) {

      if ((y < arg2_bound[0]) || (y > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + y + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((z << y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, z, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, z, y));
    return (add_ordered (x, z, y, count));
  }

  public boolean isLshift() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LshiftLong_xzy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == z) && (y == 0) ==> r = z << y
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (z == 0) && (0 <= y <= 63)   ==> r = z << y
        new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = Lshift (z, x)</samp>
 * over three long scalars.
 */
public static class LshiftLong_yzx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // x must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ LshiftLong_yzx proto;

  /** Returns the prototype invariant for LshiftLong_yzx **/
  public static /*@Prototype*/ LshiftLong_yzx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LshiftLong_yzx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LshiftLong_yzx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LshiftLong_yzx (slice);
  }

  private LshiftLong_yzx (PptSlice slice) {
    super (slice);
  }

  public LshiftLong_yzx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " << ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LshiftLong_yzx.function_id == -1;
    LshiftLong_yzx.function_id = function_id;
  }

  private static int var_order = 5;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long x) {

      if ((x < arg2_bound[0]) || (x > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + x + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((z << x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, z, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, z, x));
    return (add_ordered (y, z, x, count));
  }

  public boolean isLshift() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LshiftLong_yzx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == z) && (x == 0) ==> r = z << x
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (z == 0) && (0 <= x <= 63)   ==> r = z << x
        new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = Lshift (y, x)</samp>
 * over three long scalars.
 */
public static class LshiftLong_zyx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // x must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ LshiftLong_zyx proto;

  /** Returns the prototype invariant for LshiftLong_zyx **/
  public static /*@Prototype*/ LshiftLong_zyx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ LshiftLong_zyx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected LshiftLong_zyx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new LshiftLong_zyx (slice);
  }

  private LshiftLong_zyx (PptSlice slice) {
    super (slice);
  }

  public LshiftLong_zyx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " << ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert LshiftLong_zyx.function_id == -1;
    LshiftLong_zyx.function_id = function_id;
  }

  private static int var_order = 6;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long x) {

      if ((x < arg2_bound[0]) || (x > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + x + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((y << x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, y, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, y, x));
    return (add_ordered (z, y, x, count));
  }

  public boolean isLshift() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (LshiftLong_zyx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (x == 0) ==> r = y << x
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (y == 0) && (0 <= x <= 63)   ==> r = y << x
        new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift,
                           suppressee),

      });

  // Create a suppression factory for functionBinary

}

  // default is that it is not this function, overriden in the subclass
  public boolean isRshiftSigned () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = RshiftSigned (y, z)</samp>
 * over three long scalars.
 */
public static class RshiftSignedLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // z must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftSignedLong_xyz proto;

  /** Returns the prototype invariant for RshiftSignedLong_xyz **/
  public static /*@Prototype*/ RshiftSignedLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftSignedLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftSignedLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftSignedLong_xyz (slice);
  }

  private RshiftSignedLong_xyz (PptSlice slice) {
    super (slice);
  }

  public RshiftSignedLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftSignedLong_xyz.function_id == -1;
    RshiftSignedLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long z) {

      if ((z < arg2_bound[0]) || (z > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + z + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((y >> z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isRshiftSigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftSignedLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (z == 0) ==> r = y >>> z
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (y == 0) && (0 <= z <= 63)   ==> r = y >>> z
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((y >> z) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (z >= y) && (y >= 0) && (z valid shift)
        // This suppression really ought to have 2**z >= y, but we
        // don't have that invariant.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = RshiftSigned (x, z)</samp>
 * over three long scalars.
 */
public static class RshiftSignedLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // z must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftSignedLong_yxz proto;

  /** Returns the prototype invariant for RshiftSignedLong_yxz **/
  public static /*@Prototype*/ RshiftSignedLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftSignedLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftSignedLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftSignedLong_yxz (slice);
  }

  private RshiftSignedLong_yxz (PptSlice slice) {
    super (slice);
  }

  public RshiftSignedLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftSignedLong_yxz.function_id == -1;
    RshiftSignedLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long z) {

      if ((z < arg2_bound[0]) || (z > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + z + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((x >> z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isRshiftSigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftSignedLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (z == 0) ==> r = x >>> z
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (x == 0) && (0 <= z <= 63)   ==> r = x >>> z
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((x >> z) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (z >= x) && (x >= 0) && (z valid shift)
        // This suppression really ought to have 2**z >= x, but we
        // don't have that invariant.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = RshiftSigned (x, y)</samp>
 * over three long scalars.
 */
public static class RshiftSignedLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // y must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftSignedLong_zxy proto;

  /** Returns the prototype invariant for RshiftSignedLong_zxy **/
  public static /*@Prototype*/ RshiftSignedLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftSignedLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftSignedLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftSignedLong_zxy (slice);
  }

  private RshiftSignedLong_zxy (PptSlice slice) {
    super (slice);
  }

  public RshiftSignedLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftSignedLong_zxy.function_id == -1;
    RshiftSignedLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long y) {

      if ((y < arg2_bound[0]) || (y > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + y + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((x >> y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isRshiftSigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftSignedLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (y == 0) ==> r = x >>> y
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (x == 0) && (0 <= y <= 63)   ==> r = x >>> y
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((x >> y) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (y >= x) && (x >= 0) && (y valid shift)
        // This suppression really ought to have 2**y >= x, but we
        // don't have that invariant.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>x = RshiftSigned (z, y)</samp>
 * over three long scalars.
 */
public static class RshiftSignedLong_xzy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // y must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftSignedLong_xzy proto;

  /** Returns the prototype invariant for RshiftSignedLong_xzy **/
  public static /*@Prototype*/ RshiftSignedLong_xzy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftSignedLong_xzy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftSignedLong_xzy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftSignedLong_xzy (slice);
  }

  private RshiftSignedLong_xzy (PptSlice slice) {
    super (slice);
  }

  public RshiftSignedLong_xzy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftSignedLong_xzy.function_id == -1;
    RshiftSignedLong_xzy.function_id = function_id;
  }

  private static int var_order = 4;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long y) {

      if ((y < arg2_bound[0]) || (y > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + y + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((z >> y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, z, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, z, y));
    return (add_ordered (x, z, y, count));
  }

  public boolean isRshiftSigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftSignedLong_xzy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == z) && (y == 0) ==> r = z >>> y
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (z == 0) && (0 <= y <= 63)   ==> r = z >>> y
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((z >> y) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (y >= z) && (z >= 0) && (y valid shift)
        // This suppression really ought to have 2**y >= z, but we
        // don't have that invariant.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = RshiftSigned (z, x)</samp>
 * over three long scalars.
 */
public static class RshiftSignedLong_yzx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // x must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftSignedLong_yzx proto;

  /** Returns the prototype invariant for RshiftSignedLong_yzx **/
  public static /*@Prototype*/ RshiftSignedLong_yzx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftSignedLong_yzx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftSignedLong_yzx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftSignedLong_yzx (slice);
  }

  private RshiftSignedLong_yzx (PptSlice slice) {
    super (slice);
  }

  public RshiftSignedLong_yzx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftSignedLong_yzx.function_id == -1;
    RshiftSignedLong_yzx.function_id = function_id;
  }

  private static int var_order = 5;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long x) {

      if ((x < arg2_bound[0]) || (x > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + x + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((z >> x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, z, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, z, x));
    return (add_ordered (y, z, x, count));
  }

  public boolean isRshiftSigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftSignedLong_yzx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == z) && (x == 0) ==> r = z >>> x
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (z == 0) && (0 <= x <= 63)   ==> r = z >>> x
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((z >> x) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (x >= z) && (z >= 0) && (x valid shift)
        // This suppression really ought to have 2**x >= z, but we
        // don't have that invariant.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = RshiftSigned (y, x)</samp>
 * over three long scalars.
 */
public static class RshiftSignedLong_zyx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // x must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftSignedLong_zyx proto;

  /** Returns the prototype invariant for RshiftSignedLong_zyx **/
  public static /*@Prototype*/ RshiftSignedLong_zyx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftSignedLong_zyx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftSignedLong_zyx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftSignedLong_zyx (slice);
  }

  private RshiftSignedLong_zyx (PptSlice slice) {
    super (slice);
  }

  public RshiftSignedLong_zyx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftSignedLong_zyx.function_id == -1;
    RshiftSignedLong_zyx.function_id = function_id;
  }

  private static int var_order = 6;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long x) {

      if ((x < arg2_bound[0]) || (x > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + x + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((y >> x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, y, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, y, x));
    return (add_ordered (z, y, x, count));
  }

  public boolean isRshiftSigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftSignedLong_zyx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (x == 0) ==> r = y >>> x
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (y == 0) && (0 <= x <= 63)   ==> r = y >>> x
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((y >> x) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (x >= y) && (y >= 0) && (x valid shift)
        // This suppression really ought to have 2**x >= y, but we
        // don't have that invariant.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

  // default is that it is not this function, overriden in the subclass
  public boolean isRshiftUnsigned () {
    return (false);
  }

/**
 * Represents the invariant <samp>x = RshiftUnsigned (y, z)</samp>
 * over three long scalars.
 */
public static class RshiftUnsignedLong_xyz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // z must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftUnsignedLong_xyz proto;

  /** Returns the prototype invariant for RshiftUnsignedLong_xyz **/
  public static /*@Prototype*/ RshiftUnsignedLong_xyz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftUnsignedLong_xyz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftUnsignedLong_xyz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftUnsignedLong_xyz (slice);
  }

  private RshiftUnsignedLong_xyz (PptSlice slice) {
    super (slice);
  }

  public RshiftUnsignedLong_xyz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >>> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftUnsignedLong_xyz.function_id == -1;
    RshiftUnsignedLong_xyz.function_id = function_id;
  }

  private static int var_order = 1;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long z) {

      if ((z < arg2_bound[0]) || (z > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + z + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((y >>> z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, y, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, y, z));
    return (add_ordered (x, y, z, count));
  }

  public boolean isRshiftUnsigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftUnsignedLong_xyz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (z == 0) ==> r = y >>> z
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (y == 0) && (z valid shift) ==> r = y >>> z
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((y >> z) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (z >= y) && (y >= 0) && (z valid shift)
        // This suppression really ought to have 2**z >= y, but we
        // don't have that suppression.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = RshiftUnsigned (x, z)</samp>
 * over three long scalars.
 */
public static class RshiftUnsignedLong_yxz extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // z must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftUnsignedLong_yxz proto;

  /** Returns the prototype invariant for RshiftUnsignedLong_yxz **/
  public static /*@Prototype*/ RshiftUnsignedLong_yxz get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftUnsignedLong_yxz ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftUnsignedLong_yxz instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftUnsignedLong_yxz (slice);
  }

  private RshiftUnsignedLong_yxz (PptSlice slice) {
    super (slice);
  }

  public RshiftUnsignedLong_yxz () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >>> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftUnsignedLong_yxz.function_id == -1;
    RshiftUnsignedLong_yxz.function_id = function_id;
  }

  private static int var_order = 2;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long z) {

      if ((z < arg2_bound[0]) || (z > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + z + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((x >>> z));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, x, z, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, x, z));
    return (add_ordered (y, x, z, count));
  }

  public boolean isRshiftUnsigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftUnsignedLong_yxz.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 2, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (2, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (2, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 2, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (2, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (2, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (z == 0) ==> r = x >>> z
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (x == 0) && (z valid shift) ==> r = x >>> z
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((x >> z) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (z >= x) && (x >= 0) && (z valid shift)
        // This suppression really ought to have 2**z >= x, but we
        // don't have that suppression.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = RshiftUnsigned (x, y)</samp>
 * over three long scalars.
 */
public static class RshiftUnsignedLong_zxy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // y must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftUnsignedLong_zxy proto;

  /** Returns the prototype invariant for RshiftUnsignedLong_zxy **/
  public static /*@Prototype*/ RshiftUnsignedLong_zxy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftUnsignedLong_zxy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftUnsignedLong_zxy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftUnsignedLong_zxy (slice);
  }

  private RshiftUnsignedLong_zxy (PptSlice slice) {
    super (slice);
  }

  public RshiftUnsignedLong_zxy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >>> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftUnsignedLong_zxy.function_id == -1;
    RshiftUnsignedLong_zxy.function_id = function_id;
  }

  private static int var_order = 3;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long x, long y) {

      if ((y < arg2_bound[0]) || (y > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + y + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((x >>> y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, x, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, x, y));
    return (add_ordered (z, x, y, count));
  }

  public boolean isRshiftUnsigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftUnsignedLong_zxy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 0, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 0, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (0, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 0, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == x) && (y == 0) ==> r = x >>> y
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (x == 0) && (y valid shift) ==> r = x >>> y
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((x >> y) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (y >= x) && (x >= 0) && (y valid shift)
        // This suppression really ought to have 2**y >= x, but we
        // don't have that suppression.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>x = RshiftUnsigned (z, y)</samp>
 * over three long scalars.
 */
public static class RshiftUnsignedLong_xzy extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // y must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftUnsignedLong_xzy proto;

  /** Returns the prototype invariant for RshiftUnsignedLong_xzy **/
  public static /*@Prototype*/ RshiftUnsignedLong_xzy get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftUnsignedLong_xzy ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftUnsignedLong_xzy instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftUnsignedLong_xzy (slice);
  }

  private RshiftUnsignedLong_xzy (PptSlice slice) {
    super (slice);
  }

  public RshiftUnsignedLong_xzy () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >>> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftUnsignedLong_xzy.function_id == -1;
    RshiftUnsignedLong_xzy.function_id = function_id;
  }

  private static int var_order = 4;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long y) {

      if ((y < arg2_bound[0]) || (y > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + y + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((z >>> y));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (x, z, y, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", x, z, y));
    return (add_ordered (x, z, y, count));
  }

  public boolean isRshiftUnsigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftUnsignedLong_xzy.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (0, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (0, 1, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 1, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (0, 1, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (0, 1, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(0, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(0,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (0, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (1, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(0,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (0, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (1, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(0,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (0, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (1, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (0, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (0, 1, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 1, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (1, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (1, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == z) && (y == 0) ==> r = z >>> y
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (z == 0) && (y valid shift) ==> r = z >>> y
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((z >> y) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (y >= z) && (z >= 0) && (y valid shift)
        // This suppression really ought to have 2**y >= z, but we
        // don't have that suppression.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>y = RshiftUnsigned (z, x)</samp>
 * over three long scalars.
 */
public static class RshiftUnsignedLong_yzx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // x must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftUnsignedLong_yzx proto;

  /** Returns the prototype invariant for RshiftUnsignedLong_yzx **/
  public static /*@Prototype*/ RshiftUnsignedLong_yzx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftUnsignedLong_yzx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftUnsignedLong_yzx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftUnsignedLong_yzx (slice);
  }

  private RshiftUnsignedLong_yzx (PptSlice slice) {
    super (slice);
  }

  public RshiftUnsignedLong_yzx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >>> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftUnsignedLong_yzx.function_id == -1;
    RshiftUnsignedLong_yzx.function_id = function_id;
  }

  private static int var_order = 5;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long z, long x) {

      if ((x < arg2_bound[0]) || (x > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + x + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((z >>> x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (y, z, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", y, z, x));
    return (add_ordered (y, z, x, count));
  }

  public boolean isRshiftUnsigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftUnsignedLong_yzx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (1, 2, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (1, 2, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 2, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (1, 2, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 2, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(1, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (2, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(1,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (2, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(1,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (2, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(1,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (2, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (1, 2, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 2, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (2, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (1, 2, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (2, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 2, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == z) && (x == 0) ==> r = z >>> x
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (z == 0) && (x valid shift) ==> r = z >>> x
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((z >> x) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (x >= z) && (z >= 0) && (x valid shift)
        // This suppression really ought to have 2**x >= z, but we
        // don't have that suppression.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

/**
 * Represents the invariant <samp>z = RshiftUnsigned (y, x)</samp>
 * over three long scalars.
 */
public static class RshiftUnsignedLong_zyx extends FunctionBinary {
  // We are Serializable, so we specify a version to allow changes to
  // method signatures without breaking serialization.  If you add or
  // remove fields, you should change this number to the current date.
  static final long serialVersionUID = 20031030L;

    // x must be between arg2_bound[0] and arg2_bound[1] inclusive
    static int[] arg2_bound = {0, 63};

  private static /*@Prototype*/ RshiftUnsignedLong_zyx proto;

  /** Returns the prototype invariant for RshiftUnsignedLong_zyx **/
  public static /*@Prototype*/ RshiftUnsignedLong_zyx get_proto() {
    if (proto == null)
      proto = new /*@Prototype*/ RshiftUnsignedLong_zyx ();
    return (proto);
  }

  /** instantiate an invariant on the specified slice **/
  protected RshiftUnsignedLong_zyx instantiate_dyn (PptSlice slice) /*@Prototype*/ {
    return new RshiftUnsignedLong_zyx (slice);
  }

  private RshiftUnsignedLong_zyx (PptSlice slice) {
    super (slice);
  }

  public RshiftUnsignedLong_zyx () /*@Prototype*/ {
    super ();
  }

  private static String[] method_name = new String[] {"", " >>> ", ""};

  public String[] get_method_name () {
    return (method_name);
  }

  private static int function_id = -1;

  public int get_function_id() {
    return (function_id);
  }

  public void set_function_id (int function_id) {
    assert RshiftUnsignedLong_zyx.function_id == -1;
    RshiftUnsignedLong_zyx.function_id = function_id;
  }

  private static int var_order = 6;

  public int get_var_order() {
    return var_order;
  }

  public boolean is_symmetric() {

      return (false);
  }

  public long func (long y, long x) {

      if ((x < arg2_bound[0]) || (x > arg2_bound[1]))
        throw new ArithmeticException ("arg2 (" + x + ") out of range "
                                       + arg2_bound[0] + ".." + arg2_bound[1]);

    return ((y >>> x));
  }

  public InvariantStatus check_modified(long x, long y,
                                      long z, int count) {
    return (check_ordered (z, y, x, count));
  }

  public InvariantStatus add_modified(long x, long y,
                                      long z, int count) {
    if (Debug.logDetail())
      log (String.format ("result=%s, arg1=%s, arg2=%s", z, y, x));
    return (add_ordered (z, y, x, count));
  }

  public boolean isRshiftUnsigned() {
    return (true);
  }

  /**
   * Returns a list of non-instantiating suppressions for this invariant.
   */
  public /*@Nullable*/ NISuppressionSet get_ni_suppressions() {
    if (NIS.dkconfig_enabled && dkconfig_enabled)
      return (suppressions);
    else
      return (null);
  }

  /** definition of this invariant (the suppressee) **/
  private static NISuppressee suppressee
                    = new NISuppressee (RshiftUnsignedLong_zyx.class, 3);

  // suppressor definitions (used below)
  private static NISuppressor result_eq_arg1
    = new NISuppressor (2, 1, IntEqual.class);
  private static NISuppressor result_eq_arg2
    = new NISuppressor (2, 0, IntEqual.class);
  private static NISuppressor arg1_eq_arg2
    = new NISuppressor (1, 0, IntEqual.class);

  private static NISuppressor result_lt_arg1
    = new NISuppressor (2, 1, IntLessThan.class);
  private static NISuppressor result_lt_arg2
    = new NISuppressor (2, 0, IntLessThan.class);
  private static NISuppressor arg1_lt_arg2
    = new NISuppressor (1, 0, IntLessThan.class);
  private static NISuppressor arg2_lt_arg1
    = new NISuppressor (0, 1, IntLessThan.class);

  private static NISuppressor result_le_arg1
    = new NISuppressor (2, 1, IntLessEqual.class);
  private static NISuppressor result_le_arg2
    = new NISuppressor (2, 0, IntLessEqual.class);
  private static NISuppressor arg1_le_arg2
    = new NISuppressor (1, 0, IntLessEqual.class);
  private static NISuppressor arg2_le_arg1
    = new NISuppressor (0, 1, IntLessEqual.class);

  private static NISuppressor result_track0_arg1
    = new NISuppressor (2, 1, NumericInt.ZeroTrack.class);
  private static NISuppressor result_track0_arg2
    = new NISuppressor (2, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_arg2
    = new NISuppressor (1, 0, NumericInt.ZeroTrack.class);
  private static NISuppressor arg1_track0_result
    = new NISuppressor (1, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_result
    = new NISuppressor (0, 2, NumericInt.ZeroTrack.class);
  private static NISuppressor arg2_track0_arg1
    = new NISuppressor (0, 1, NumericInt.ZeroTrack.class);

  private static NISuppressor result_eq_1
    = new NISuppressor(2, RangeInt.EqualOne.class);
  private static NISuppressor arg1_eq_1
    = new NISuppressor (1, RangeInt.EqualOne.class);
  private static NISuppressor arg2_eq_1
    = new NISuppressor (0, RangeInt.EqualOne.class);

  private static NISuppressor result_eq_0
    = new NISuppressor(2,RangeInt.EqualZero.class);
  private static NISuppressor arg1_eq_0
    = new NISuppressor (1, RangeInt.EqualZero.class);
  private static NISuppressor arg2_eq_0
    = new NISuppressor (0, RangeInt.EqualZero.class);

  private static NISuppressor result_ne_0
    = new NISuppressor (2, NonZero.class);
  private static NISuppressor arg1_ne_0
    = new NISuppressor (1, NonZero.class);
  private static NISuppressor arg2_ne_0
    = new NISuppressor (0, NonZero.class);

  private static NISuppressor result_ge_0
    = new NISuppressor (2, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg1_ge_0
    = new NISuppressor (1, RangeInt.GreaterEqualZero.class);
  private static NISuppressor arg2_ge_0
    = new NISuppressor (0, RangeInt.GreaterEqualZero.class);

  private static NISuppressor result_ge_64
    = new NISuppressor (2, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg1_ge_64
    = new NISuppressor (1, RangeInt.GreaterEqual64.class);
  private static NISuppressor arg2_ge_64
    = new NISuppressor (0, RangeInt.GreaterEqual64.class);

  private static NISuppressor result_boolean
    = new NISuppressor(2,RangeInt.BooleanVal.class);
  private static NISuppressor arg1_boolean
    = new NISuppressor (1, RangeInt.BooleanVal.class);
  private static NISuppressor arg2_boolean
    = new NISuppressor (0, RangeInt.BooleanVal.class);

  private static NISuppressor result_even
    = new NISuppressor (2, RangeInt.Even.class);
  private static NISuppressor arg1_even
    = new NISuppressor (1, RangeInt.Even.class);
  private static NISuppressor arg2_even
    = new NISuppressor (0, RangeInt.Even.class);

  private static NISuppressor result_power2
    = new NISuppressor(2,RangeInt.PowerOfTwo.class);
  private static NISuppressor arg1_power2
    = new NISuppressor (1, RangeInt.PowerOfTwo.class);
  private static NISuppressor arg2_power2
    = new NISuppressor (0, RangeInt.PowerOfTwo.class);

  private static NISuppressor result_and0_arg1
    = new NISuppressor (2, 1, NumericInt.BitwiseAndZero.class);
  private static NISuppressor result_and0_arg2
    = new NISuppressor (2, 0, NumericInt.BitwiseAndZero.class);
  private static NISuppressor arg1_and0_arg2
    = new NISuppressor (1, 0, NumericInt.BitwiseAndZero.class);

  // The arguments to bitwise subset are backwards from what one
  // might expect.  The second argument is a subset of the first
  // argument
  private static NISuppressor arg1_bw_subset_arg2
    = new NISuppressor (0, 1, NumericInt.BitwiseSubset.class);
  private static NISuppressor arg2_bw_subset_arg1
    = new NISuppressor (1, 0, NumericInt.BitwiseSubset.class);

  private static NISuppressor result_shift0_arg1
    = new NISuppressor (2, 1, NumericInt.ShiftZero.class);
  private static NISuppressor result_shift0_arg2
    = new NISuppressor (2, 0, NumericInt.ShiftZero.class);
  private static NISuppressor arg1_shift0_arg2
    = new NISuppressor (1, 0, NumericInt.ShiftZero.class);

  private static NISuppressor arg2_divides_arg1
    = new NISuppressor (1, 0, NumericInt.Divides.class);
  private static NISuppressor arg1_divides_arg2
    = new NISuppressor (0, 1, NumericInt.Divides.class);

  private static NISuppressor arg2_valid_shift
    = new NISuppressor (0, RangeInt.Bound0_63.class);

    private static NISuppressionSet suppressions
      = new NISuppressionSet (new NISuppression[] {

        // (r == y) && (x == 0) ==> r = y >>> x
        new NISuppression (result_eq_arg1, arg2_eq_0, suppressee),

        // (r == 0) && (y == 0) && (x valid shift) ==> r = y >>> x
        // new NISuppression (result_eq_0, arg1_eq_0, arg2_valid_shift
        //                   ,suppressee),

        // (r == 0) && ((y >> x) == 0)
        new NISuppression (result_eq_0, arg1_shift0_arg2, suppressee),

        // (r == 0) && (x >= y) && (y >= 0) && (x valid shift)
        // This suppression really ought to have 2**x >= y, but we
        // don't have that suppression.  This still might catch a lot of these.
        // new NISuppression (result_eq_0, arg1_le_arg2, arg1_ge_0,
        //                   arg2_valid_shift, suppressee),
      });

  // Create a suppression factory for functionBinary

}

}
